Java中有三种移位运算符

Java中有三种移位运算符

<<      :     左移运算符,0001 << 1,结果是0010

>>      :     右移运算符,0010 >> 1,结果是0001

>>>    :     无符号右移,忽略符号位,空位都以0补齐

  • “>>>”无符号右移位操作符,无论符号是正负,都在高位插入0(都变成了正数)。

-1>>>1得到的结果是2147483647,是Integer的最大值。

-1的二进制补码:
1111 1111 1111 1111 1111 1111 1111 1111
右移一位,在最左边空出的一位插入0,变成了32位整数的最大值:
0111 1111 1111 1111 1111 1111 1111 1111
结果是2147483647

  • 快速算出移位运算符结果方法:


在不大于自身数值类型最大位数的移位时,一个数移位n,就是将这个数乘以(左移)2的n次幂,右移就是除,然后都取整就可以了
比如int 32位的
500>>3 这样算:500/8 取整 就是62
356>>4 356/16 结果是 22
8<<3 8*8 结果是 64

64位和上面方法一样。
如果移动过大超过了32位怎么办 移位数和32取余得到的数字在套用上面就可以了
比如 500>>67 怎么算?(就相当于500>>3)
1.先67对32取余 结果是3
2. 然后500/8 结果62

  • 补充一点:计算机指令种的右移位运算符有2种,左移就是补0没花哨。但右移就有点事情了。

1. 算术右移 意思是你移动后补的是最高位的值。
举例:一个byte数字99 的二进制是 0110 0011
你右移4位后 补的是0 ------0000 0110
但是再看这一个:byte数字-107二进制是1001 0101 这是1开头的
你右移4位后补的确是最高位1 -------1111 1001
2.逻辑右移 补0就完事了

针对右移,C语言美显示给出用哪种的,一般根据编译器/机器组合来确定用哪一种,但大多数都默认算术右移。
JAVA就比较严谨了,明确规定x>>k是算术右移
x>>>k是逻辑右移
话说回来之所以区分这一点我想应该是对有符号的规定吧,无符号右移肯定是逻辑的啊 最高位本来就是0,然而对于负数最高位是1,在进行右移时算术右移的提出解决了一个很普遍的问题,那就是负整数的除法运算,你负数除以一个正数一定是负数吧,如果没有算数右移这一概念的提出不补1都补0的话你得到的就是正数了,算术右移可以替代除法运算。有了这个就完美了,得到的还是负数,符合现实中数学常识了

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值