一、补码
32位补码 | int(十进制) | int(十六进制) | unsigned int |
0111......1111 | 2147483647 | 0x7fffffff | 2147483647 |
00111111重复四次 | 1061109567 | 0x3f3f3f3f | 1061109567 |
1111......1111 | -1 | 0xffffffff | 4294967295 |
1000......0000 | -2147483648 | \ | 2147483648 |
二、移位运算
1、左移
1<<n=2^n
n<<1=2*n
2、算数右移,即n>>1,结果是n除以二向下取整
例:(-3)>>1=-2;3>>1=1
而在c++中,除以二取整为向零取整
例:(-3)/2=-1;3/2=1
三、二进制状态压缩
二进制状态压缩:是指将一个长度m的bool数组用一个m位二进制整数表示并存储的方法,下面是一些存储技巧
1、取出n在二进制下的第k位:(n>>k)&1
2、取出n在二进制下的第0~k-1位(后k位):n&((1<<k)-1)
3、把n在二进制下的第k位取反:n xor (1<<k)
4、对整数n在二进制下第k位赋值1:n|(1<<k)
5、对整数n在二进制下第k位赋值0:n&(~(1<<k))
四、位运算优先级
+,- > <<,>> > <,>,==,!= > & > xor(c++) > |
五、成对变换
对非负数n:
当n位偶数时,n xor 1 = n + 1
当n位奇数时,n xor 1 = n - 1
因此,0和1、2和3、4和5......构成成对变换
这一性质常用于对边集的存储(无向图中双向边经常成对、相邻存储在表中)
六、lowbit运算
1、lowbit(n)定义为非负整数n在二进制表示下,最低位的1及其后边所有的零构成的数值
例如11000100,通过lowbit是100
2、通过n-lowbit(n)可以删去n在二进制中的最后一个1,例如10000100可以变为10000000
3、实现:lowbit(n)=n&(~n+1)=n&(-n)
4、lowbit运算配合hash可以找出整数二进制下所有是1的位
5、lowbit运算也是树状数组应用中的一个基本运算