今天在看 Kafka 源码 LongSerializer
时看到将 Long 型转 byte 数组的实现,感觉需要补习一下位运算符 (bitwise operator),所以有了这篇。
Java 提供的位运算符有:
- 左移 (
<<
)、右移 (>>
) - 无符号左移 (
<<<
)、无符号右移 (>>>
) - 位与 (
&
) - 位或 (
|
) - 位非 (
~
) - 位异或 (
^
)
除了位非 ( ~
) 是一元操作符外,其它的都是二元操作符。
与或非,亦或 就不说了。
左移
左移 1 位 (<<1
) ,值乘 2,以后依次乘 2.
右移
右移 1 位 (>>1
),值除以 2。
无符号右移
对于负数,二进制高位为 1,所以一个 int 类型的 -5
二进制表示是
1111 1111 1111 1111 1111 1111 1111 1011
对于负数,使用右移 >>
时,则高位补 1,而对于无符号右移,则高位补 0 。
延伸
由位运算操作符衍生而来的有:
&=
按位与赋值|=
按位或赋值^=
按位非赋值>>=
右移赋值 a »= 1 就是 a = a » 1<<=
赋值左移>>>=
无符号右移赋值
和 +=
一样,理解为 a += 1 也就是 a = a + 1。