A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李伟 中级黑马   /  2012-6-11 18:24  /  2247 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

通过试验,比如0x40000000左移或者右移31位都是0,可是左移或者右移32就变回原数0x40000000了,按常规理解结果应该也是0啊,这是为什么,谢谢回答

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
当左移的位数大于等于该数值类型的最大位数时,编译器会用左移的位数对此类型的最大位数取模,然后按余数进行移位,
比如说:
0x4000 0000是31位,int型,最大32位
0x4000 0000<<1,结果是0x8000 0000,32位
0x4000 0000<<2,结果超过32位,最左边的1被移出,剩下的32位全是0,所以结果是0x0000 0000,即0
一直到0x40000000<<31,都会将左边的数左移,最左边的1被移出,剩下全是0,所以结果都是0
0x4000 0000<<32,此时32位等于int型最大位数,所以左移位数为32%32=0,即左移0位,所以仍为原数
0x4000 0000<<33,此时33>32,故左移位数为33%32=1,即左移1位,结果为0x8000 0000,32位
0x4000 0000<<34,此时34>32,左移位数为34%32=2,左移2位,由前面的运算已经知道,0x40000000<<2后是0
一直到0x40000000<<63,此时相当于左移63%32=31位,
0x4000 0000<<64,此时左移64%32=0,相等于左移32位,也相当于左移0位,结果为原数。
依次类似。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 wyl530274554 于 2012-6-11 19:25 编辑

class Demo {
        public static void main(String[] args) {
                int i = 0x40000000;
               
                System.out.println(i>>31);        //0
               
                System.out.println(i>>32);        //1073741824
                System.out.println(i>>64);        //1073741824
                System.out.println(i>>128);        //1073741824               
               
                System.out.println(i>>1);        //536870912
                System.out.println(i>>33);        //536870912
        }
}

JAVA位移硬规定:
当位移的位数大于等于该数值类型的最大位数时,编译器会用位移的位数对此类型的最大位数取模,然后按余数进行移位

例如:
int整型右移:32位为一循环
即>>32相当于>>0
>>33相当于>>1

评分

参与人数 1黑马币 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
原来是JAVA位移硬规定啊,明白了,谢谢啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马