前言
在阅读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