黑马程序员技术交流社区

标题: 移位运算符中的疑问 [打印本页]

作者: 尹志鹏    时间: 2013-5-9 20:52
标题: 移位运算符中的疑问
本帖最后由 尹志鹏 于 2013-5-10 08:53 编辑

我昨天才开始看毕老师的视频自学,新人第一次发帖,希望能解决疑惑。

移位运算符的规律为乘以或者除以2的移位数次方。用二进制方法来移位也是非常好懂的。
但是还是有一个问题困扰我于是自己编代码去实现。
当右边是负数时是否也具有这个特点呢?通过自己的代码查看到结果,知道区别于右边是正数。
疑问一:那右边是负数的时候是什么规律?
疑问二:右边是负数的时候又怎样用二进制去运算移位呢?
代码如下


  System.out.println(-10>>-2);//-1
  System.out.println(10>>-2);//0
  System.out.println(-10<<-2);//-2147483648
  System.out.println(10<<-2);//-2147483648
  System.out.println(-10>>>-2);//3
  System.out.println(10>>>-2);//0
  

  
  System.out.println(-10>>2);//-3
  System.out.println(10>>2);//2
  System.out.println(-10<<2);//-40
  System.out.println(10<<2);//40
  System.out.println(-10>>>2);//1073741821
  System.out.println(10>>>2);//2

作者: 逝者轨迹    时间: 2013-5-9 21:39
》运算符,如果高位时0,右移后的空位就补0,如果最高位是1,右移后的空位就补1
作者: 逝者轨迹    时间: 2013-5-9 21:39
逝者轨迹 发表于 2013-5-9 21:39
》运算符,如果高位时0,右移后的空位就补0,如果最高位是1,右移后的空位就补1 ...

无符号右移不管最高位,全部补0
作者: 尹志鹏    时间: 2013-5-9 22:01
逝者轨迹 发表于 2013-5-9 21:39
》运算符,如果高位时0,右移后的空位就补0,如果最高位是1,右移后的空位就补1 ...

嗯这个是移位运算符的规则,但是我的疑问是比如8>>-2,-8>>-2,右边是负数时怎么弄,没有移-2位的说法,但是编译不报错,像前面六行代码我就不清楚很疑惑,总结不出来规律,后面六行毕老师都有总结,易懂!
作者: 尹志鹏    时间: 2013-5-9 22:02
逝者轨迹 发表于 2013-5-9 21:39
无符号右移不管最高位,全部补0

而且前六行后后六行的区别就是右边多了负号,但是没有一个结果是一样的!
作者: 尹志鹏    时间: 2013-5-9 22:08
怎么没见懂得人回复啊,还是这个问题很少用,没有引起大家的注意!那我就接着看视频去了!
作者: 逝者轨迹    时间: 2013-5-9 22:36
尹志鹏 发表于 2013-5-9 22:01
嗯这个是移位运算符的规则,但是我的疑问是比如8>>-2,-8>>-2,右边是负数时怎么弄,没有移-2位的说法, ...

负数右移一个负数位的结果为-1,正数右移一个负数位的结果为0.剩下几个就不知道是怎么个意思了。不过,移动一个负数位貌似没有什么意义吧
作者: 尹志鹏    时间: 2013-5-9 22:42
逝者轨迹 发表于 2013-5-9 22:36
负数右移一个负数位的结果为-1,正数右移一个负数位的结果为0.剩下几个就不知道是怎么个意思了。不过,移 ...

我刚也试了,正数右移负数位为0,负数右移负数位为-1
作者: 尹志鹏    时间: 2013-5-10 08:51
在技术交流模块弄懂了,左值是int型时,右值取二进制的低五位换算成十进制,这样保证了右值范围为0~32,也就是楼上的-2低五位为111110换算成十进制就是30,所以把楼上的-2变成30结果是一样的。左值是long型是,取右值低六位。




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