一、关键词
**|(或)、&(与)、~(非)和^(异或)**
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1 |
或 | 或 | 两个位都为0时,结果才为0 |
^ | 非 | 两个位相同为0,相异为1 |
~ | 左移 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
二:作用
1. 与:
- 清零:如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
- 取一个数的指定位:比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
- 判断奇偶:只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
2. 或:
- 常用来对一个数据的某些位设置为1:比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。
3. 异或:
异或的性质:
- 交换律
- 结合律 (ab)c == a(bc)
- 对于任何数x,都有 xx=0,x0=x
- 自反性: abb=a^0=a
- 翻转指定位:比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
- 与0相异或值不变:例如:1010 1110 ^ 0000 0000 = 1010 1110
- 交换两个数:
void Swap(int &a, int &b){
if (a != b){
a ^= b;
b ^= a;
a ^= b;
}
}
4. 取反:
- 使一个数的最低位为零:使a的最低位为0,可以表示为:a & ~1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为" ~"运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
5.左移运算法:
定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000,若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
6.右移运算法:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负,操作数每右移一位,相当于该数除以2。