提供一个大佬的博客:(:绝对强大
https://blog.csdn.net/zmazon/article/details/8262185
功能介绍
义 | 说明 | 样例 | |
& | 按位与 | 把参数与运算的两个数位相与,只有对应的的二进制均为1时,结果对应的位才为1,否则为0 | 9&5中的9可以写成(00001001),5可以写成(00000101),那么9&5的运算结果为(00000001),输出十进制结果为1. |
| | 按位或 | 把参数与运算的两个数位相或,只要对应的的二进制位有一个为1时,结果对应的位就为1,否则为0 | 9|5中的9可以写成(00001001),5可以写成(00000101),那么9|5的运算结果为(00001101),输出十进制结果为13. |
^ | 按位异或 | 把参数与运算的两个数位相异或,当对应的二进制位上的数据数据字相同时,结果为0,否则为1 | 1^1=0,1^0=1,0^1=1,0^0=0 9^5相当于00001001^00000101,运算结果为00001100,十进制结果为12. |
~ | 取反 | 把运算符的各个er'j二进制位按位求反。 | ~9相当于~(00001001),运算结果为11110110,相当于十进制246 |
<<
| 左移 | 把“<<”左边的运算数的各二进制位全部左移若干位,"<<“右边的数是指定移动的位数,高位舍弃,低位补零. | a<<4指把a的各个二进制位向左移动四位,如a=00000011(十进制为3),左移四位后为(00110000),十进制表示为48. |
>> | 右移 | 把“>>”左边的运算数的各二进制位全部右移若干位,">>“右边的数是指定移动的位数,高位补零,低位舍弃. | 设a=15,a>>2表示把001111右移为00000011(十进制为3)。 |
经常使用的点
1. 使用按位与判断数的奇偶性,
1&a==1,表示a为奇数
1&a==0,表示a为偶数
2.使用按位异或,交换两个数的值,不使用临时变量
性质:
交换性:a^b=b^a
结合性:a^b^c=(a^b)^c=a^(b^c)
相同异或:a^a=0
与 0 异或不变:a^0=a
使用方法
void swap(int & a,int & b)
{
if(a==b)
return ;
a^=b;
b^=a;
a^=b;
}
详解
一:a = a ^ b,a的值fa'sh发生变化
二:b = a ^ b, 将 a =a ^ b带入,得到 b=(a ^ b) ^ b=a ^ (b ^ b)=a ^ 0=a,即运算后 b 的值为 a
三:a = a ^ b,a 的值仍然是 a ^ b,b 的值为 a,执行后,得到 a=(a ^ b) ^ a=a ^ a^ b=0 ^ b=b
注意的是a!=b,当a==b时,a^b=0,不能继续执行
3.使用左移||右移符进行除2或者*2运算
a>>=1…………a=a/2;
a<<=1…………a=a*2;