Bit Manipulation

位运算

基本思路:将给定的数字都转化为二进制,然后进行相应的操作。

左移

符号<<

操作:将数字转换成二进制,然后左移x位,空缺补零。

效果:乘2^x

例子:

7<<1 =14, 7<<2=28…

7的二进制是111,左移后变成1110是14。

右移

符号:>>

操作:将数字转化成二进制,然后右移x位

效果:除2^x

例子:

7>>1=3, 7>>2=1

7的二进制是111,右移变成11。

与操作

符号:&

操作:将两数字a,b转换成二进制,如果位数不同短的前面补零,之后逐位算与,得到结果。

常用:用a&1判断a的奇偶。

例子:

7&3=3

111

&

011

=011=3

或操作

符号|

符号:&

操作:将两数字a,b转换成二进制,如果位数不同短的前面补零,之后逐位算或,得到结果。

例子:

7&3=7

111

|

011

=

111

抑或操作

符号:^

操作:将两数字转换为二进制,长度不等短的前面补零,二者逐位比较,相同为0,不同为1

例子:

7^3=4

111

^

011

=

100=4

应用:交换两数字a,b:

a^=b

b^=a

a^=b

三部操作后a,b互换

比如:

a=101 b=11101。操作一后 a=11000 操作二后 b=101 操作三后 a = 11101。

非操作

符号:~

操作:将数子转换为二进制,每位取反(此时前面的0也作数,比如Java中32位表示一个整数)

例子:

~7=-8

~00000000000000000000000000000111

=

11111111111111111111111111111000

=-8

无符号右移

符号:>>>

操作:无视整数的正负,将其右移一位。

Java 正负数的表示

Java中用32为表示一个整数,其中最高位表示的是整数的符号,0为正1为负。因此有以下几点注意:

  1. 得到一个数的相反数就将其取反+1。比如:7=00000000000000000000000000000111,,7=11111111111111111111111111111001

  2. 对于右移操作(>>),考虑原来数字的正负,因此移动完毕后在前面用0或1补位(正数补0,负数补1)。而对于无符号右移操作(>>>),不考虑符号,移动完毕后都补0。比如:

    7>>1=3, -7>>1=-3, 7>>>1=3, -7>>>1=2147483644。(对正数来说都一样)。

  3. 左移操作没有无符号一说,都是在末尾补0。

Author: Shuchen
Link: http://yoursite.com/2019/08/31/bit-manipulation/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.