一元运算符
与(&)
概念
两个位都为1时,结果才为1
例:0&0=0 0&1=0 1&0=0 1&1=1
用处
a.清零
只要与一个各位都为零的数值相与,结果为零。
b.判断奇偶
判断最后一位是0或1来判断是奇是偶。
偶(a & 1) == 0
奇(a & 1) == 1
c.去一个数的指定位
若是要取一个数的后四位,只需要利用一个后四位数均为1的数相与
或(|)
概念
两个位都为0时,结果才为0
例:0|0=0 0|1=1 1|0=1 1|1=1
用处
a.将某些位数转为1
将某个数与想转为一的位设置位1的数取或可以实现将该数的某些位数转成1
异或(^)
概念
两个位相同为0,相异为1
例:0^0=0 0^1=1 1^0=1 1^1=0
用处
a.翻转指定位
将要翻转的数的位找一个该位为1其与为0的数异或
b.交换两个数
void Swap(int &a, int &b){ if (a != b){ a ^= b; b ^= a; a ^= b; } }
c.判断是否同号
a^b > 0 同号
a^b < 0 异号
取反(~)
概念
0变1,1变0
例:0^0=0 0^1=1 1^0=1 1^1=0
用处
a.将一个数最低位转为0
使a的最低位为0,可以表示为:a & 1。1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0
左移(<<)
概念
各二进位全部左移若干位,高位丢弃,低位补0
例:1001<<1 = 10010
用处
a.可实现*2的操作
右移(>>)
概念
各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
例:1001>>1 = 100
用处
a.可实现/2的操作
复合运算符
&=
例:a&=b 相当于 a=a&b
|=
例:a|=b 相当于 a=a|b
>>=
例:a>>=b 相当于 a=a>>b
<<=
例:a<<=b 相当于 a=a<<b
^=
例:a^=b 相当于 a=a^b
参考文章:菜鸟教程位运算