0%

Java-位运算符

前言

在阅读HashMap的源码中,对许多位运算符都分不太清了。所以这里对位运算符做一个复习。

位运算符

位运算符的特点是会按照二进制去进行运算,例如3&5,先把3和5转化为二进制,然后每一位进行&运算,得出二进制的结果

~ 按位非

运算规则: ~b 先将b转化为二进制数,对每一位进行取反
eg: ~3的计算过程
3      00000000 00000000 00000000 00000011
result 11111111 11111111 11111111 11111100 (负数这里为补码需要转换)
-1     11111111 11111111 11111111 11111011 反码
~      10000000 00000000 00000000 00000100 原码 => -4

移位

<< 和 >>
a<<b 左移位操作符,将a的二进制向左移动b位,0补位,等同于乘以2的b次方 
eg: 3<<2=12
3      00000000 00000000 00000000 00000011
->     00000000 00000000 00000000 00001100

a>>b 右移位操作符,将a的二进制向右移动b位,正数0补位,负数1补位,等同于除以2的b次方 
eg: 4>>2=1
4      00000000 00000000 00000000 00000100
->     00000000 00000000 00000000 00000001

eg: -4>>2=-1
-4     11111111 11111111 11111111 11111100
->     11111111 11111111 11111111 11111111 (负数这里为补码需要转换)
-1     11111111 11111111 11111111 11111110 反码
~      10000000 00000000 00000000 00000001 原码 => -1
>>> 无符号右移
类似>>,区别在于不管正数负数都用0补位
eg: -4>>>2=1073741823
-4     11111111 11111111 11111111 11111100
->     00111111 11111111 11111111 11111111

& 按位与

运算规则: a&b 先将a,b转化为二进制数,当且仅当相同位数都为1时,结果是1,否则为0
eg: 3&5的计算过程
3      00000000 00000000 00000000 00000011
5      00000000 00000000 00000000 00000101
result 00000000 00000000 00000000 00000001 => 1

| 按位或

运算规则: a|b 先将a,b转化为二进制数,当且仅当相同位数都为0时,结果是0,否则为1
eg: 3|5的计算过程
3      00000000 00000000 00000000 00000011
5      00000000 00000000 00000000 00000101
result 00000000 00000000 00000000 00000111 => 7

^ 按位异或

运算规则: a^b 先将a,b转化为二进制数,当且仅当相同位数只有一个为1时,结果是1,否则为0
eg: 3^5的计算过程
3      00000000 00000000 00000000 00000011
5      00000000 00000000 00000000 00000101
result 00000000 00000000 00000000 00000110 => 6