算数位运算
在现代架构中,位运算速度与加法运算相同,快于乘法运算。
一、位运算符
(1)取反【NOT】
二进制数每一位取反,0变1,1变0
操作符‘~’ NOT 0111 = 1000
(2)按位或【OR】
处理长度相同的二进制数,有1为1
操作符‘|’ 0101 OR 0011 = 0111
(3)按位异或【XOR】
不同为1,相同为0
操作符‘^’ 0101 XOR 0011 = 0110
ex:当n为偶数时,n ^ 1 = n + 1;当n为奇数时,n ^ 1 = n - 1
so,“0与1” “2与3” “4与5”…关于xor 1运算构成“成对变换”,可用于边的存储
(4)按位与【AND】
两1为1,否则为0
操作符‘&’ 0101 AND 0011 = 0001
ex:可以用来判断一个数的奇偶(if(b&1))
如果一个数是奇数,二进制数最低位一定为1,偶数最低位为0
运算符优先级
加减—>移位—>比较大小—>位与—>异或—>位或
+,- <<,>> >,<,==,!= & ^ |
二、移位
将二进制数中的每一位全部朝一个方向移动,溢出部分被舍弃,空缺部分填入一定值【0】。
左移‘<<’ 0001(十进制1)<< 3 = 1000(十进制8)
1<<n = 2^n n<<1 = 2n
右移‘>>’ 1010(十进制10)>> 2 = 0010(十进制2)
n>>1 = n/2 (向下取整)
二进制状态压缩
是将长度为m的bool数组用一个m位二进制整数表示并存储。
操作 实现
取出整数n在二进制表示下的第k位 (n>>k)&1
取出整数n在二进制表示下的第0~k-1位(后k位) n&((1<<k)-1)
把整数n在二进制表示下的第k位取反 n^(1<<k)
对整数n在二进制表示下的第k位赋值为1 n|(1<<k)
对整数n在二进制表示下的第k位赋值为0 n&(~(1<<k))
lowbit 运算
lowbit(n)为非负整数n在二进制表示下“最低位的1及其后边所有的0”构成的数值。ex:n=10 ==> 1010,则lowbit(10)=2
lowbit(n) = n&(~n+1) = n&(-n)