Java 移位运算详解

个人网站:生命不息 折腾不止

1、左移运算符:<<

先随便定义一个int类型的数int,十进制的value = 733183670,转换成二进制在计算机中的表示如下:

value << 1,左移1位

左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代。

value << 8,左移8位看一下:

左移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1,也就是说成了负数,在使用中要考虑变成负数的情况。

根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?答案是NO,当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)
注意:其它几种整形byte,short移位前会先转换为int类型(32位)再进行移位。

综上所述:左移 << 其实很简单,也就是说丢弃左边指定位数,右边补0。

2、右移运算符:>>

还是这个数:733183670

value >> 1,右移1位

右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移运算符来替代

value >> 8,右移8位看一下

和左移一样,int类型移位大于等于32位时,long类型大于等于64位时,会先做求余处理再位移处理,byte,short移位前会先转换为int类型(32位)再进行移位。以上是正数的位移,我们再来看看负数的右移运算,如图,负数intValue:-733183670的二进制表现如下图:

右移8位,intValue >> 8

综上所述:右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上符号位。

3、无符号右移运算符:>>>

无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。以-733183670>>>8为例来画一下图

无符号右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上0。

4. 快速算出移位运算符结果的方法(只适用小数值):

在不大于自身数值类型最大位数的移位时,一个数左移n位,就是将这个数乘以2的n次幂;一个数右移n位,就是将这个数除2的n次幂,然后取整。
比如int32位的(64位也是同样方法):

7 >> 1  = 7/2  取整为3
7 << 1  = 7*2  为14

如果移动位数超过了32位怎么办?把移位数和32取余数得到的数字套用即可:

如 9 >> 67
1、先67对32取余,结果是3
2、然后9/8 得到结果为1

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值