位移运算问题
System.out.println(Long.toBinaryString((-1)<<32));
System.out.println(Long.toBinaryString((-1L)<<32));
结果分别是
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111100000000000000000000000000000000
第二个输出倒是在预料之内,主要是不明白第一个的输出,为什么结果和第二个输出不一样?
我隐约感觉应该是第一个算出来的类型是int类型,所以导致了这个问题。
但更深层次的,就想不到了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
也就是当int指定向左移动32位时,已经超过了范围所以会对32进行取模操作,希望对你有帮助,如果能帮到您希望能够采纳。
举例来说明这个问题:
我先来解读下这两段代码的区别点在于前期我们位移的时候的元素,第一个位移的元素是int类型,第二个位移的元素是long类型,前面已经说到int的位移0-31位,long的位移是0-63位,第一个int移动了33位已经超出了该类型的最大位数,则会对指定位移的33位取模操作,取模底数为2,最后计算得出结果是1位。
输出结果也是移动了1位,为什么前面是int类型的长度会这么长,因为你转成了long类型,我有对该内容进行了补充,如果又不懂得请留言。