我有这样的代码:
int i = 255;
byte b = (byte) i;
int c;
System.out.println(Integer.toBinaryString( i));
System.out.println("b = " + b); // b = -1
c=b>>>1;
System.out.println(Integer.toBinaryString( c));
System.out.println(c);但我不明白它是怎么工作的。我认为没有签名的转移到255(11111111)应该会给我127(0111111),但它没有。我的假设是错误的吗?
发布于 2014-03-16 09:59:35
包括>>>在内的shift运营者在int上操作。在转移之前,b的值是-1,因为byte是签名的,因此它被提升到int。这就是为什么你看到了你看到的结果。
255被重新解释为-1的原因是255将其所有8位都设置为1。当您将其分配给已签名的8位byte类型时,它将被解释为遵循http://en.wikipedia.org/wiki/Two%27s_complement规则的-1。
发布于 2014-03-16 10:01:45
这就是如何获得预期结果的方法。
c = (0xFF & b) >>> 1;详情见dasblinkenlight的答案
发布于 2014-03-16 10:11:32
试试这个,你就会明白:
System.out.println(Integer.toBinaryString(i)); // 11111111
System.out.println(Integer.toBinaryString(b)); // 11111111111111111111111111111111
System.out.println(Integer.toBinaryString(c)); // 1111111111111111111111111111111变量int i等于255个,所以第一个打印是有意义的。
变量byte b等于-1,因为您将255个存储在一个字节中。
Integer.toBinaryString(b)时,编译器将b从byte转换为int,并将(int)-1 == FFFFFFFFh == 11111111111111111111111111111111b转换为第二次打印。变量int c等于b>>>1,所以第三次打印是有意义的。
https://stackoverflow.com/questions/22435401
复制相似问题