考虑的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
怎么样?
考虑的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
怎么样?
的问题是,所有的参数都是第一次晋升为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
以获得所需的效果。
哦,上帝Java是如此的破碎 - 谁说混合算法对于程序员来说太复杂了? – 2012-07-01 12:49:37
@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
我猜想b
的标志扩展为int
在换档之前。
所以这可能按预期工作:
(byte)((0x000000FF & b)>>4)
根据Bitwise and Bit Shift Operators:
无符号向右移位运算符“>>>”移动零到最左边的位置,而最左边的位置“>>”取决于符号扩展。因此,与
b >> 4
你变换1111 0001
到1111 1111
(b为负,所以追加1
),这是0xff
。
Java试图通过定义两个不同的移位运算符来显式支持无符号基本类型。
这个问题是关于无符号右移的问题,但是这两个例子都有(有符号和无符号),并显示了有符号位移(>>)的值。
您的计算适用于无符号移位(>>>)。
也许这个字节是第一个符号扩展到int – CodesInChaos 2010-10-16 09:01:28