0
点赞
收藏
分享

微信扫一扫

位运算的应用

kmoon_b426 2022-04-17 阅读 116
位运算

一、补码

32位补码int(十进制)int(十六进制)unsigned int
0111......111121474836470x7fffffff2147483647
00111111重复四次10611095670x3f3f3f3f1061109567
1111......1111-10xffffffff4294967295
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运算也是树状数组应用中的一个基本运算

举报

相关推荐

0 条评论