Java中的位运算
无整理 不简书
Java中的位运算符有 &(与),|(或),~(非),^(异或),>>(有符号右移),<<(左移),>>>(无符号右移)
进行位运算的前提是要知道位运算是二进制补码各位分别运算且范围比 int 类型小的都要转化成 int 类型(32位),范围比 int 类型大的以本身的类型运算。除了 >> (有符号右移)以外,其他位运算符都与符号无关。
例:byte 8,byte -4
ps:以下二进制均为补码,请自行验证真值。
&(与):1 & 1为1,其余为0。
0000 0000 0000 0000 0000 0000 0000 1000(8的32位补码)
1 111 1 111 1111 1 111 1111 1 111 1 111 1100(-4的32位补码)
0000 0000 0000 0000 0000 0000 0000 1000(8 & -4 = 8)
| (或) :0 | 0为0,其余为1。
0000 0000 0000 0000 0000 0000 0000 1000(8的32位补码)
1 111 1 111 1111 1 111 1111 1 111 1 111 1100(-4的32位补码)
1 111 1 111 1111 1 111 1111 1 111 1 111 1100(8 | -4 = -4)
~(非):非 0 即 1,非 1 即 0。
0000 0000 0000 0000 0000 0000 0000 1000(8的32位补码)
1 111 1 111 1111 1 111 1111 1 111 1 111 0111(~8 = -9)
^(异或):相同为 0,不同为 1。
0000 0000 0000 0000 0000 0000 0000 1000(8的32位补码)
1 111 1 111 1111 1 111 1111 1 111 1 111 1100(-4的32位补码)
1 111 1 111 1111 1 111 1111 1 111 1 111 0100(8 ^ -4 =-12)
>>(有符号右移):整体右移,左侧补充与符号位相同的数,即符号位为1(负数),则补1;符号位为0(整数),则补0。
0000 0000 0000 0000 0000 0000 0000 1000(8的32位补码)
0000 0000 0000 0000 0000 0000 0000 0100(8 >> 1 = 8 / 2 =4)
/
1 111 1 111 1111 1 111 1111 1 111 1 111 1100(-4的32位补码)
1 111 1 111 1111 1 111 1111 1 111 1 111 1110(-4 >> 1 =-4 / 2 =-2)
<<(左移):整体左移,无论正负数,右侧补充 0。
0000 0000 0000 0000 0000 0000 0000 1000(8的32位补码)
0000 0000 0000 0000 0000 0000 0001 0000(8 << 1=8 * 2=16)
>>>(无符号右移):整体右移,无论正负数,左侧补充 0。
0000 0000 0000 0000 0000 0000 0000 1000(8的32位补码)
0000 0000 0000 0000 0000 0000 0000 0100(8 >> 1 = 8 / 2 =4)
/
1 111 1 111 1111 1 111 1111 1 111 1 111 1100(-4的32位补码)
0 111 1 111 1111 1 111 1111 1 111 1 111 1110
(-4 >>> 1=2147483646)
如有错误之处,请指正。