开心飞艇官网好程序员-千锋教育旗下高端IT职业教育品牌

400-811-9990
我的账户
好程序员

专注高端IT职业培训

亲爱的猿猿,欢迎!

已有账号,请

如尚未注册?

  • 客服QQ
  • 官方微信

    好程序员

    专注高端IT职业培训

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

[复制链接]
325 0
叶子老师 发表于 2019-8-8 14:03:33 | 只看该作者 |阅读模式 打印 上一主题 下一主题
        好程序员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学习路线http://cdxfjz.com/javaEE_class.shtml

精彩内容,一键分享给更多人!
收藏
收藏0
转播
转播
分享
淘帖0
支持
支持0
反对
反对0
回复

使用道具 举报

您需要登录后才可以回帖

本版积分规则

关注我们
千锋好程序员

开心飞艇官网北京校区(总部):北京市海淀区宝盛北里西区28号中关村智诚科创大厦

开心飞艇官网深圳西部硅谷校区:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619

杭州龙驰智慧谷校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层

郑州校区:郑州市二七区航海中路60号海为科技园C区10层、12层

开心飞艇官网Copyright 2007-2019 北京千锋互联科技有限公司 .All Right

开心飞艇官网京ICP备12003911号-5 京公安网11010802011455号

请您保持通讯畅通1对1咨询马上开启