在Java中,位移运算是基本运算,符号是左位移和右位移。 因为在Java中只有整数可以位移,所以其他都不考虑。 因为位移运算会位移表示内存中整数的二进制文件,所以Java分为正数和负数的位移。
正数时,向左移位相当于除以2。 请注意整数除以整数。 例如5 1即5/2=2。
举例说明。
51、以int为例:
数字5
int类型的二进制文件显示为000000000000000000000000000000000000000000000001
向左移动一位,即,00000000000000000000000000000001010 (低位0补充) ) )。
其结果是,数字为10
51、以int为例:
数字5
int类型的二进制文件显示为000000000000000000000000000000000000000000000001
向右移动一位,则为00000000000000000000000000000000000000 (上位补充0 )
其结果是数字2
因此,正数可以自由使用位移,与乘除几乎没有区别,而且性能更好。
负数时,Java的位移运算在Java中称为有符号位移,因此必须谨慎使用Java的位移。 那么,有符号位移是怎么计算的呢? 以下直接举例说明。
-51、以int为例。 负数作为补数存在于存储器中,请参阅:
数字-5
int类型的二进制代码显示为1000000000000000000000000000000000000000000000001
其反码为111111111111111111111111111111111111111111111111010
补码是11111111111111111111111111111111111111111111111011
向左移动1位后,结果为11111111111111111111111111111111110110 (低位补充0 )
将结果逆编码为111111111111111111111111111111111111111111111110101
如果将结果计算为原始代码,则为1000000000000000000000000000000000000001010
其结果是数字-10
看起来还是乘以2,换个数字吧:
例如,如果数字的二进制数为1110,0000,0000,0000,0000,0000,0000,0001
其反码为100111111111111111111111111111111111111111111111111111111111111111111111111111111111111
补码是100111111111111111111111111111111111111111111111111111111111111111111111
向左移动一位,结果为001111111111111111111111111111111111111111111111111111111111111111111110
这个结果的最高位是0,所以必然是正数。 因此,结果并不比想象的乘以2。
右移时,高位补1,结果相同,不正常。 示例:
-51、以int为例。 负数作为补数存在于存储器中,请参阅:
数字-5
int类型的二进制代码显示为1000000000000000000000000000000000000000000000001
其反码为111111111111111111111111111111111111111111111111010
补码是11111111111111111111111111111111111111111111111011
向右移动一位后,结果为1111111111111111111111111111111111111111111111101 (高位补充)
将结果逆编码为: 11111111111111111111111111111111111111111111111111111111111100
如果将结果计算为原始代码,则为1000000000000000000000000000000000000000000000001
其结果是数字-3
另一方面,在Java中,-5除以2应该是-2,但位移是-3。
另外,如果是以下例子:
-11,以int为例。 负数作为补数存在于存储器中,请参阅:
数字-1
int类型的二进制代码显示为10000000000000000000000000000000000000000000000000000001
其反码为111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
补码是1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
向右移动一位时,结果为1111111111111111111111111111111111111111111111111111111111 (高位补缺1 )
不用慢慢计算结果就知道是数字-1
所以对-1来说,无论向右移动多少次,结果都是-1,但除以2就是0。
最后总结一下,如果是正数的话,可以在可以使用位移运算的时候尽量使用,从而提高性能,但是负数的话,尽量不要使用。 结果与除法运算相差甚远。