首页 > 编程语言 > 详细

好程序员Java学习路线分享Java中的位移运算

时间:2019-08-08 16:30:35      阅读:94      评论:0      收藏:0      [点我收藏+]

好程序员Java学习路线分享Java中的位移运算Java中,位移运算属于基本运算,符号是<<>>,即向左位移和向右位移。在Java中只有整数才能位移,所以其他的不考虑,位移运算是将整数在内存中表示的二进制进行位移,所以在Java中分为正数和负数的位移。

对于正数来说,向左位移,即<<相当于乘以2,移动多少次即乘以多少次2,例如5<<25 * 2 * 2 = 20,而向右位移即>>相当于除以2,注意是整数除以整数。例如 5 >> 1 5/2=2

下面举例说明:

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

另外,如果是下面的例子:

-1>>1,我们以int为例,由于负数在内存是以补码存在,请看:

   数字-1

int型的二进制原码表示为: 1000 0000  0000 0000  0000 0000  0000 0001

而其反码为:1111 1111  1111 1111  1111 1111  1111 1110

补码为:1111 1111  1111 1111  1111 1111  1111 1111

向右移1位即结果为:1111 1111  1111 1111  1111 1111  1111 1111 (高位补1

所以结果不用慢慢算就知道为:数字-1

所以对于-1来说,无论怎么右移,结果还是-1,而如果是除以2,结果是0

最后总结一句,如果是正数,当可以使用位移运算时可以尽量使用,能提升性能,而对于负数来说,还是尽量别用吧,结果与除法相差太远。

好程序员Java学习路线分享Java中的位移运算

原文:https://www.cnblogs.com/gcghcxy/p/11321289.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!