Java 移位>>运算符,看代码。

public class Test {

public static void main(String[] args) {
// TODO Auto-generated method stub

int i = -4;
System.out.println(i >> 3);//-1
System.out.print(i >> 5);//-1
}
}
为什么结果是-1,不是0

-4的二进制表示为1111 1111 1111 1011
i>>3 右移3位,移出的不管,左端补1 变为1111 1111 1111 1111 这是-1的二进制表示,所以结果为-1.
i>>5 同理。

具体原理:
先来说一下怎么得出负数的二进制。原码,反码,补码,这三个概念搞清。
1、原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
10000000 00000000 00000000 00000101 是 -5的 原码。

备注:
比如byte类型,用2^8来表示无符号整数的话,是0 - 255了;如果有符号, 最高位表示符号,0为正,1为负,那么,正常的理解就是 -127 至 +127 了.这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0(10000000和00000000);还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作,最后运算结果的符号还要与大的符号相同;于是,反码产生了。

2、反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反[每一位取反(除符号位)]。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101
负数10000000 00000000 00000000 00000101 的反码则是 11111111 11111111 11111111 11111010。

反码是相互的,所以也可称:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互为反码。

备注:还是有+0和-0,没过多久,反码就成为了过滤产物,也就是,后来补码出现了。

3、补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
比如:10000000 00000000 00000000 00000101 的补码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

备注:1、从补码求原码的方法跟原码求补码是一样的 ,也可以通过完全逆运算来做,先减一,再取反。
2、补码却规定0没有正负之分

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

搞懂二进制表示后,再来说一下左移右移运算符。
左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。(均由机器来定)

So,为什么得到-1知道了吧~~~
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-06-06
int是32位,负数在计算机中存放的是补码:
-4 在计算机中的二进制表示为:11111111 11111111 11111111 11111100
右移3位或者5位之后变为:11111111 11111111 11111111 11111111(补码)
10000000 00000000 00000000 00000001(原码)
所以输出的是-1.
第2个回答  2015-06-06
>>(带符号右移)
>>>(无符号右移)
System.out.println(Integer.toBinaryString(-4));//11111111111111111111111111111100
System.out.println(Integer.toBinaryString(-4>>3));//11111111111111111111111111111111
System.out.println(Integer.toBinaryString(-4>>5));//11111111111111111111111111111111本回答被网友采纳
第3个回答  2020-03-21
  学习Java本来就是一件日积月累的事情,或许你通过自学能掌握一些皮毛技术,通过Java学习机构学到Java的一些基本大面,但想要做到精通,还是需要自己技术的日积月累和工作经验的不断积累。

  今天给大家分享的技术知识是:Java中的位移运算符!
  1) “有符号”左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。
  左移移位相当于乘以2,例如
  3 << 2 //12 则是将数字3左移2位 3*2*2 = 3*(2的2次方)
  分析:首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12.数学意义:
  在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
  2) “有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。 “有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。
  >>运算规则:按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补符号位,移位后得到的数字为正数则补0,负数补1。
  例如11 >> 2,则是将数字11右移2位
  分析:11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010.转换为十进制是3.数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。
  3) Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0
  4)右移一位相当于除以2,左移一位(在不溢出的情况下)相当于乘以2;移位运算速度高于乘除运算。
  5)位运算符的优先级
  ~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。

java二进制左移 >>> 什么意思?int a=-1;a=a>>>24 为什么a是 255...
“>>>”是右移位运算符好8,看方向都知道了。“>>>”在右移后,在最左边补上0。另外顺带介绍一下“<<”和“>>“运算符:“<<”左移运算符在左移后,右边补上0;“>>“右移运算符则相反,在右移后,左边补上原来的位(原来是0就补上0,原来是1就补上1)。注意这里”>>>“和“>>...

Java中的位移运算中的>>(逻辑右移)和>>>(算术右移)的区别?
逻辑右移是将各位依次右移指定位数,然后在左侧补0,算术右移是将各位依次右移指定位数,然后在左侧用原符号位补齐

JAVA中的“>>”和“>>>”运算符
1、>>:右移运算符,num >> 1,相当于num除以2。按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。符号位不变。如:-1在32位二进制中表示为:11111111 11111111 11111111 11111111 -1>>1:按位右移,符号位不变,仍旧得到11111111 11111111 ...

java位移运算符
1) “有符号”左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。左移移位相当于乘以2,例如 3 << 2 \/\/12 则是将数字3左移2位 3*2*2 = 3*(2的2次方)分析:首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧...

Java,a>>b是什么意思?
<< 和>>是java中的移位运算符,<<是左移位,>>是右移位,因为数据存储是二进制的所以左移1相当于乘以2的1次方,右移相当于乘以2的-1次方,例如 << : 左移运算符,num << 1,相当于num乘以2,num << 2,相当于num乘以2再乘以2 >> : 右移运算符,num >> 1,相当于num除以...

Java中,位运算符>>,右移时左边何时补0,何
举个例子:2左移动3位 2(十进制)=00000010(二进制)二进制00000010向左移动三位变成了00010,超出了8位,相当于删除前三个字符位,删除之后又由于不满足8位,后面填0,变成00010000 00010000(二进制) = 16(十进制)

java >>=怎么算的
java中>>代表的是向右移位运算,而>>=代表的是向右移位运算时将运算的结果同时赋值给原值,举个例子说明一下:int index = 7;int index2 = index>>1,则表示将7转化为二进制数后向右移动一位,而原值不变,故index = 7 ,index2 = 3;int index3 = index>>=1,则表示将7转化为二进制...

Java中,–128>>4等于多少,怎么算的
在JAVA中,>>是移位运算符,4表示向右位移4位,–128转为二进制是-10000000,向右移动4位就是-1000(二进制),转回即为-8。

JAVA里面的位运算符>>,<<,>>>是什么意思,请举个列子具体说明一下?_百 ...
java 中:>>带符号右移 (n>>2 将整型值带符号右移2位 )<<带符号左移 (n<<2 将整型值带符号左移2位 )>>>无符号右移 (n>>>2 将整型值无符号右移2位 ) 在32位系统中任何数左移(右移)32位还是它本身 例如:�6�1a=a<<2将a...

Java中,位运算符>>,右移时左边何时补0,何时补1
“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算...

相似回答