位运算运算符:
注:位运算基于补码
1.按位取反 ~ (1 0互换)
2.按位与 & (和&&同理)
3.按位或 | (和||同理)
4.按位异或 ^ (不同为1,相同为0)
5.右移 >> (右位消失,左侧补符号位或0)
6.左移 << (左位消失,右侧补0)
位运算技巧:
1.关于&
取二进制某位上的数:
例如取后三位,将Num & 111
原理:因为num & 1 = 本身, num & 0 = 0;
实际:思考num%8,实际就是取二进制的后三位,于是:num % 8 等价于 num & 7
2.关于^
常用于加密,解密
原理:num ^ 0 = num, num ^ 1 = !num
3.将某位设置为1或0(置位,清位)
置位:
SET(NUM, i)
((num) |=(1 << (7 - i)) 或 (1 << ((i) ^ 7))
实际就是将0000 0001中的1移到想要置位的位置,将Num | 结果
原理:num | 1 = 1 ; num | 0 = num;
清位:
CLR(NUM, i)
((num) &= ~(1 << (7 - i)) 或 ~(1 << ((i) ^ 7))
实际就是将1111 1110中的0移到想要置位的位置,将Num & 结果
原理:num & 1 = num, num & 0 = 0;
取位:
(num >> (i ^ 7)) & 1
将所求位移到最右,结果&1 (即除最右,都变0)
解释:
上述操作都用到了i^7这个操作,实际是替换了7-i
假如想将i = 0位置零,按原理我们需要将0000 0001中1移到开头,即左移7位,
所以就是<<(7 - i) 但若想加快这个计算,用二进制计算更为快捷
7-i == i ^7