黑马程序员技术交流社区

标题: java 中的带符号>>右移操作疑问 [打印本页]

作者: andylau    时间: 2013-11-3 09:23
标题: java 中的带符号>>右移操作疑问
        System.out.println(-6>>2);//-2;//这是为何?(我的理解应该是-1)
        System.out.println(-6>>1);//-3;//这个还能理解
        System.out.println(-6>>3);//-1;这是为何?(我的理解应该是0)
        System.out.println(-6>>4);//-1;这是为何?(我的理解应该是0)


作者: 回天之力    时间: 2013-11-3 09:52
移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。
所以你要看清楚上面的,在重新右移一下。
作者: ixiangfeng    时间: 2013-11-3 09:57
带符号右移 最高位是多少则补多少
-6的二进制是1111   1111   1111   1111    1111    1111    1111    1010
带符号右移1位则为   1(补)  1111   1111   1111   1111    1111    1111    1111    101(0去除)  转为十进制为-3
带符号右移2位则为   11(补)  1111   1111   1111   1111    1111    1111    1111    10(10去除) 转为十进制为-2
带符号右移3位则为   111(补)  1111   1111   1111   1111    1111    1111    1111    1(010去除) 转为十进制为-1
带符号右移4位则为   1111(补)  1111   1111   1111   1111    1111    1111    1111   (1010去除) 转为十进制为-1

作者: 麦者    时间: 2013-11-3 10:02
过程如下   
-6>>2   100000000000000000000110
                111111111111111111111001
                111111111111111111111010
                111111111111111111111110
                111111111111111111111101
                100000000000000000000010
               
        >>3        100000000000000000000110
                111111111111111111111001
                111111111111111111111010
                111111111111111111111111
                111111111111111111111110
                100000000000000000000001
               
        >>4        100000000000000000000110
                111111111111111111111001
                111111111111111111111010
                111111111111111111111111
                111111111111111111111110
                100000000000000000000001
作者: 黄炳期    时间: 2013-11-3 10:50
帖子已重新分类,若还有疑惑,可继续提问。




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