黑马程序员技术交流社区

标题: 关于左移右移的问题 [打印本页]

作者: 李伟    时间: 2012-6-11 18:24
标题: 关于左移右移的问题
通过试验,比如0x40000000左移或者右移31位都是0,可是左移或者右移32就变回原数0x40000000了,按常规理解结果应该也是0啊,这是为什么,谢谢回答
作者: 赵兵锋    时间: 2012-6-11 18:58
当左移的位数大于等于该数值类型的最大位数时,编译器会用左移的位数对此类型的最大位数取模,然后按余数进行移位,
比如说:
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位,结果为原数。
依次类似。

作者: 黑马-王言龙    时间: 2012-6-11 19:13
本帖最后由 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


作者: 李伟    时间: 2012-6-12 12:10
原来是JAVA位移硬规定啊,明白了,谢谢啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2