位运算符是非常底层的运算,以速度极快著称。位运算符有:&|^~>><<>>> 。部分位运算符也可作逻辑运算符,主要通过运算符左右两侧连接的操作数类型区分。如果左右连接的是布尔类型,则作逻辑运算符,否则作位运算符。

左移 <<

左移运算符不区分有无符号,因为==符号位不参与移位==。高位舍弃,低位补0。

3<<2=12 为例:

3在底层的存储形式为 00000000 00000000 00000000 00000011 ,符号位不动,其余位左移2位,得到 00000000 00000000 00000000 00001100 ,十进制形式即为12。

-3<<2=-12 为例:

-3在底层的存储形式为 11111111 11111111 11111111 11111101 ,符号位不动,其余位左移2位,得到 11111111 11111111 11111111 11110100 ,十进制形式即为-12。

我们不难发现,一个数每左移1位,其实就相当于乘以2一次。

Question:4乘以8最快的方式是什么?

Answer:4<<3

有符号右移 >>

有符号右移的低位舍弃,==符号位不参与移位==,而高位补全的是符号位。根据左移的规律推测,右移相当于除以2。

6>>2=1 为例:

6在底层的存储形式为 00000000 00000000 00000000 00000110 ,右移2位,低位的 10 舍弃,高位补全符号位0,所以得到 00000000 00000000 00000000 00000001 ,十进制形式为1。

-6>>2=-2 为例:

-6在底层的存储形式为 11111111 11111111 11111111 11111010 ,右移2位,低位的 10 舍弃,高位补全符号位1,所以得到 11111111 11111111 11111111 11111110 ,十进制形式为-2。

无符号右移 >>>

无符号右移的低位舍弃,==符号位参与移位==,而高位补全的是0。

6>>>2=1 为例:

6在底层的存储形式为 00000000 00000000 00000000 00000110 ,右移2位,低位的 10 舍弃,高位补全0,所以得到 00000000 00000000 00000000 00000001 ,十进制形式为1。

-6>>>2 为例:

-6在底层的存储形式为 11111111 11111111 11111111 11111010 ,右移2位,低位的 10 舍弃,高位补全0,所以得到 00111111 11111111 11111111 11111110 ,十进制形式为1073741822。

按位与 &

将参加运算的两个数据,按二进制位进行与运算。两个都是1则为1,其余情况都是0。

6&3=2 为例:

JavaSE-16-1

按位或 |

将参加运算的两个数据,按二进制位进行或运算。两个中有1则为1,两个全为0则是0。

6|3=7 为例:

JavaSE-16-2

异或 ^

将参加运算的两个数据,按二进制位进行异或运算。相同为0,不同为1。

6^3=5 为例:

JavaSE-16-3

按位取反 ~

将数据按二进制位进行取反运算。0变成1,1变成0。

~6=-7 为例:

6的二进制形式为 00000000 00000000 00000000 00000110 ,取反为11111111 11111111 11111111 11111001 ,十进制形式为-7。