对JAVA中位移操作的理解

在看jdk源码的时候,经常在源码中看到位移操作符,但是我个人几乎没有在项目中使用过。为什么不用?只有一个原因:“不会”。 使用一项技术,不管是开源框架,还是第三方工具,首先要理解该技术本身,其次要理解应用场景。 我们开始学习理解位移: ">>" (位移)和 ">>>" (无符号位移) ">>" n 向右位移n位:右移之后,左侧空出来的位置,以符号位补充。 ">>>" n 向右位移n位:右移之后,左侧空出来的位置,以 0 补充。 因为Java中的移位操作只对int和long有效,对byte、short、char进行位移操作,都是先转化为int后再进行移位, 举例:

1、右移操作(对空位补充符号位 )
 -10 ">>" 1  值为 -5,(数值在计算过程中都是使用补码操作)。
 -10的原码:1000 0000 0000 0000 0000 0000 0000 1010
 -10的反码:1111 1111 1111 1111 1111 1111 1111 0101 (负数的反码是原码的符号位不变,其他取反)
 -10的补码 : 1111 1111 1111 1111 1111 1111 1111 0110 (负数的补码是其反码+1)
 -10">>"1 :  1111 1111 1111 1111 1111 1111 1111 0110  
 右移1位--> 1111 1111 1111 1111 1111 1111 1111 1011 (符号位为1,表示负数)
 原码:     1000 0000 0000 0000 0000 0000 0000 0101 = -5

 2、无符号右移(对空位补充 0 )
 -10">>>"1:  1111 1111 1111 1111 1111 1111 1111 0110  (补码)
无符号右移1位:0111 1111 1111 1111 1111 1111 1111 1011 = 2147483643   (正数,直接求得结果)

转载于:https://my.oschina.net/nipin/blog/718995

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值