Java中的整型移位操作,为什么是“只有数值右端的低5位才有用”?
PHP中文网
PHP中文网 2017-04-17 11:24:27
[Java讨论组]

大家好,最近在看《Java编程思想》,在第三章“操作符”中有这么一段:

如果对char、byte或者short类型的数值进行移位处理,那么在移位进行之前,它们会被转成int类型,并且得到的结果也是一个int类型的值。只有数值右端的低5位才有用。这样可防止我们移位超过init型值所具有的位数。(译注:因为2的5次方为32,而int型值只有32位。

之后google查到了这篇文章:http://blog.csdn.net/showershow/article/details/6959122,不过还是没懂。

虽然译者做了注解,不过我还是不明白,为什么是“只有数值右端的低5位才有用”?有谁能够解释一下吗?谢谢!

PS. 第一次来这里,发现编辑器竟然支持Markdown,非常不错!

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
怪我咯

题主可能理解错了。

a = b << c  

规范中说的 只有数值右端的低5位才有用 说的是 c

我们先看 b,在计算过程中,b 被转换成 int,因为 int 类型是 32 位,也就是 b 的值最多可以移动 31 位。

如果把 b 移动 33 位,只有最后的 5 位有效,于是:

(为了方便测试,一下代码为 js 代码)

50 << 33
// output:100

等价于

50 << (33%32)
// output:100

也就是

50 << 1
// output:100

为了严谨,题主自行在 java 中测试。

巴扎黑

因为int只有32位,<< 32就溢出了呀。所以限制为最右边那5位,以防溢出( 2 ** 5 = 32 )。

ringa_lee

我的理解是这样的,java编程思想是说的>>>这个无符号的右移为操作符的右边数值不能大于31,比如int i = -1,i >>> 33里面的数值右端指的是33这个数值。即取33的低位1[0 0001],所以只向右移动一位

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号