位运算
基本思路:将给定的数字都转化为二进制,然后进行相应的操作。
左移
符号<<
操作:将数字转换成二进制,然后左移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。比如:7=00000000000000000000000000000111,,7=11111111111111111111111111111001
对于右移操作(>>),考虑原来数字的正负,因此移动完毕后在前面用0或1补位(正数补0,负数补1)。而对于无符号右移操作(>>>),不考虑符号,移动完毕后都补0。比如:
7>>1=3, -7>>1=-3, 7>>>1=3, -7>>>1=2147483644。(对正数来说都一样)。
左移操作没有无符号一说,都是在末尾补0。
