Java中的位运算包括:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),
特别注意:除了位非( ~ )是一元操作符外,其它的都是二元操作符。并且在进行位运算的时候,例如a&b操作,都需要首先把a和b转换成二进制再进行操作
1.位与(&)
规则:a&b,先把十进制数a b都转换为二进制数,&的运算规则是:第一个操作数a的第n位与第二个操作数b的第n位如果都是1,那么结果的第n位也为1,否则为0
举例:5&3
先把5和3都转换为二进制
5---->0000 0000 0000 0000 0000 0000 0000 0101
3---->0000 0000 0000 0000 0000 0000 0000 0011
-----------------------------------------
----->0000 0000 0000 0000 0000 0000 0000 0001 结果转换为十进制则为1
2.位或(|)
规则:a|b,先把a b都转换为二进制数,|的规则为:第一个操作数a的第n位与第二个操作数b的第n位中只要有一个为1,那么结果的第n位位1,否则为0
举例:5|3
5---->0000 0000 0000 0000 0000 0000 0000 0101
3---->0000 0000 0000 0000 0000 0000 0000 0011
-----------------------------------------
----->0000 0000 0000 0000 0000 0000 0000 0111 结果转换为十进制为7
3.位非(~)
位非位一元运算符,规则是:操作数的第n位为1则结果第n位为0,第n位为0,则结果第n位为1
举例:5
0000 0000 0000 0000 0000 0000 0000 0101
--------------------------------
1111 1111 1111 1111 1111 1111 1111 1010 结果为-6
4.位异或( ^ )
规则:第一个操作数的的第n位与第二个操作数的第n位相反,那么结果的第n为也为1,否则为0
举例:5^3
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------
0000 0000 0000 0000 0000 0000 0000 0110 结果为6
5.左移运算(<<)
a<<b
规则:将a转换为二进制,所有数向左移动b位,如果a为正数,低位补0,如果a为负数,低位也是补0
例:5<<2
0000 0000 0000 0000 0000 0000 0000 0101
------------------------------
0000 0000 0000 0000 0000 0000 0001 0100 结果为20
6.右移运算
a>>b
规则:将a转换为二进制,所有数向右移动b位,如果a为正数,高位补0,如果a为负数,则高位补1
举例:5>>2
0000 0000 0000 0000 0000 0000 0000 0101
-----------------------------
0000 0000 0000 0000 0000 0000 0000 0001 结果为1
7.无符号右移(>>>)
a>>>b
规则:正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,都用0进行补位(这样由负数变成了正数了),正数或者负数左移,低位都是用0补
例如 -5换算成二进制后为:
1111 1111 1111 1111 1111 1111 1111 1011
举例:分别对5进行右移3位、 -5进行右移3位和无符号右移3位操作
5---> 0000 0000 0000 0000 0000 0000 0000 0101
-------------------------------------
0000 0000 0000 0000 0000 0000 0000 0000 结果为0
-5--->1111 1111 1111 1111 1111 1111 1111 1011
-----------------------------------
1111 1111 1111 1111 1111 1111 1111 1111 1111 结果为-1
-5--->1111 1111 1111 1111 1111 1111 1111 1011
----------------------------------------------------------------
0001 1111 1111 1111 1111 1111 1111 1111 // (用0进行补位) 结果为536870911