位运算与:&
0&0 = 0
0&1 = 0
1&0 = 0
1&1 = 1
代码演示:
#include<iostream>
using namespace std;
int main(){
unsigned char ch1 = 61; // 0011 1101
unsigned char ch2 = 92; // 0101 1100
// 位运算与:&
cout << "位运算且:" << (ch1 & ch2) << endl; // 0001 1100 = 28
return 0;
}
位运算或:|
0|0 = 0
0|1 = 1
1|0 = 1
1|1 = 1
代码演示:
#include<iostream>
using namespace std;
int main(){
unsigned char ch1 = 61; // 0011 1101
unsigned char ch2 = 92; // 0101 1100
// 位运算或:|
cout << "位运算或:" << (ch1 | ch2) << endl; // 0111 1101 = 125
return 0;
}
位运算非:~
~0 = 1
~1 = 0
代码演示:
#include<iostream>
using namespace std;
int main(){
unsigned char ch3 = ~61; // 61: 0011 1101
cout << "位运算非:" << (int)(ch3) << endl; // 1100 0010 = 194
return 0;
}
位运算异或:^
0^0 = 0
0^1 = 1
1^0 = 1
1^1 = 0
(相同为0,不同为1)
代码演示:
#include<iostream>
using namespace std;
int main(){
unsigned char ch1 = 61; // 0011 1101
unsigned char ch2 = 92; // 0101 1100
// 位运算异或:^
cout << "位运算异或:" << (ch1 ^ ch2) << endl; // 0110 0001 = 97
return 0;
}
位运算左移:<<
右边的位用 0 来填充, 移动超出左边边界的位则直接抛弃。
向左移动 n 个位置,就等同于乘以 2 的 n 次,只适用于: int/short/long/char 等定点数类型(float/double 浮点数类型不能使用)
代买演示:
#include<iostream>
using namespace std;
int main(){
unsigned char ch1 = 61; // 0011 1101
// 位运算左移:<<
// 左移两位
cout << "位运算左移:" << (ch1 << 2) << endl; // 1111 0100 = 244
return 0;
}
位运算右移:>>
如果右操作数是无符号类型,则左边多出来的位用 0 来填充。
如果右操作数是有符号类型,则左边多出来的位用 符号位(最高位) 来填充。
向右移动 n 个位置,就等同于除以 2 的 n 次方 只适用于: int/short/long/char 等定点数类型(float/double 浮点数类型不能使用)
代码演示:
#include<iostream>
using namespace std;
int main(){
unsigned char ch1 = 61; // 0011 1101
// 位运算右移:<<
// 右移两位
cout << "位运算左移:" << (ch1 >> 2) << endl; // 0000 1111 = 14
return 0;
}
综合练习:
把一个整数数最低的四位数变为0110
#include<iostream>
using namespace std;
int main(){
unsigned char ch4 = 125;
// 第一步:后四位变为:0000
ch4 = ch4 & (~15); // 15:1111 ~15: 1111 0000
cout << "第一步:后四位为0000:" << (int)ch4 << endl; // 112: 0111 0000
// 第二步: 后四位为:0110
ch4 = ch4 | 6; // 0110: 6
cout << "第二步: 后四位为0110:" << (int)ch4 << endl; // 118:
return 0;
}