2010-10-16 46 views
18

考虑的java代码如下剪断行为无符号右移适用于字节变量

byte b=(byte) 0xf1; 
byte c=(byte)(b>>4); 
byte d=(byte) (b>>>4); 

输出:

c=0xff 
d=0xff 

预期输出:

c=0x0f 

怎么样? as b in binary 1111 0001 无符号右移0000 1111因此0x0f但为什么是0xff怎么样?

+3

也许这个字节是第一个符号扩展到int – CodesInChaos 2010-10-16 09:01:28

回答

32

的问题是,所有的参数都是第一次晋升为int移位操作发生前:

byte b = (byte) 0xf1; 

b签订,所以它的值是-15。

byte c = (byte) (b >> 4); 

b是第一符号扩展到整数-15 = 0xfffffff1,然后向右移位到0xffffffff和截短到0xff通过浇铸到byte

byte d = (byte) (b >>> 4); 

b是第一符号扩展到整数-15 = 0xfffffff1,然后向右移位到0x0fffffff和截短到0xff通过浇铸到byte

你可以做(b & 0xff) >>> 4以获得所需的效果。

+12

哦,上帝Java是如此的破碎 - 谁说混合算法对于程序员来说太复杂了? – 2012-07-01 12:49:37

+1

@PP在Java中没有无符号数不是问题(除了整数除法,并且最终将在JDK 8中修复):http://stackoverflow.com/questions/397867/port-of-random-generator -from-C到Java/397997#397997 – starblue 2012-07-01 19:06:17

3

我猜想b的标志扩展为int在换档之前。

所以这可能按预期工作:

(byte)((0x000000FF & b)>>4) 
1

根据Bitwise and Bit Shift Operators

无符号向右移位运算符“>>>”移动零到最左边的位置,而最左边的位置“>>”取决于符号扩展。因此,与b >> 4

你变换1111 00011111 1111(b为负,所以追加1),这是0xff

0

Java试图通过定义两个不同的移位运算符来显式支持无符号基本类型。

这个问题是关于无符号右移的问题,但是这两个例子都有(有符号和无符号),并显示了有符号位移(>>)的值。

您的计算适用于无符号移位(>>>)。