关于Java的位运算,我之前没怎么注意,因为用的很少。但是,我在面试题遇到了这一部分的考察。所以,特此记录一下。
首先说一下,理解位运算的前提是对计算机的原码、反码和补码之间的掌握比较熟练,这里就不多说了,这是理解位运算的前提,不然一切都是白搭。下面,我就具体说一下位运算怎也用。
Java的位运算包括&(位与运算),|(位或运算),^(位异或运算),~(按位取反运算),<<(左移),>>(右移),(无符号右移)
A>&运算(有0则0) 例如3&4
首先,将3和4都转换成二进制形式,即
3=00000000 00000000 00000000 00000011
4=00000000 00000000 00000000 00000100
结果是0
B>|运算(有1则1) 和&运算类似
C>^运算(相同则0,不同则1) 和&运算类似
D>~运算,这个比较麻烦,具体计算过程如下。 例如~3
首先,求出补码。3=00000000 00000000 00000000 00000011
然后,每一位都进行取反操作。即11111111 11111111 11111111 11111100(补码)
然后,求出反码。即11111111 11111111 111111111 11111011
最后,求出原码。即10000000 00000000 00000000 00000100 结果是-4
E> <<运算(左移最高位丢弃,右边补0)
>>运算(最高位是0,左边补0;最高位是1,左边补1)
>>>无符号右移(无论最高位是0还是1,最高位都补0)
注意:移位运算操作的是二进制数对应的补码,而不是原码