下面举例说明:
5<<1,我们以int为例:
数字5
int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101
向左移1位即: 0000 0000 0000 0000 0000 0000 0000 1010 (后位补0)
所以结果为:数字10
5>>1,我们以int为例:
数字5
int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101
向右移1位即: 0000 0000 0000 0000 0000 0000 0000 0010 (高位补0)
所以结果为:数字2
所以对于正数,可以随意使用位移,与乘除几乎没有结果的区别,而且性能更优。
而对于负数来说,Java中的位移应该谨慎使用,因为位移运算在Java中称为带符号的位移。那么到底带符号的位移是如何计算的呢,下面直接举例说明:
-5<<1,我们以int为例,由于负数在内存是以补码存在,请看:
数字-5
int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0101
而其反码为:1111 1111 1111 1111 1111 1111 1111 1010
补码为:1111 1111 1111 1111 1111 1111 1111 1011
向左移1位即结果为:1111 1111 1111 1111 1111 1111 1111 0110 (后位补0)
将结果计算反码为:1111 1111 1111 1111 1111 1111 1111 0101
将结果计算原码为:1000 0000 0000 0000 0000 0000 0000 1010
所以结果为:数字-10
看起来好像还是乘以2,但是换个数字来试试:
例如数字的二进制如果为:1110 0000 0000 0000 0000 0000 0000 0001
而其反码为:1001 1111 1111 1111 1111 1111 1111 1110
补码为:1001 1111 1111 1111 1111 1111 1111 1111
向左移1位即结果为:0011 1111 1111 1111 1111 1111 1111 1110
这个结果的最高位是0,所以必然是个正数,所以结果并非想象的乘以2。
如果是右移,那么高位会补1,结果一样不算正常,例如:
-5>>1,我们以int为例,由于负数在内存是以补码存在,请看:
数字-5
int型的二进制原码表示为: 1000 0000 0000 0000 0000 0000 0000 0101
而其反码为:1111 1111 1111 1111 1111 1111 1111 1010
补码为:1111 1111 1111 1111 1111 1111 1111 1011
向右移1位即结果为:1111 1111 1111 1111 1111 1111 1111 1101 (高位补1)
将结果计算反码为:1111 1111 1111 1111 1111 1111 1111 1100
将结果计算原码为:1000 0000 0000 0000 0000 0000 0000 0011
所以结果为:数字-3
而在Java中,-5除以2应该结果为-2,但是位移却为-3。