写的函数:短GetBits(短数据,INT P,INT n)的
题
我写一个函数短getBits(短数据,INT P,INT n)的
我曾尝试:
public static short getBits(short data, int p, int n) {
short bitmask = (short) ((~0 << (16 -n)) >>> p);
short returnVal = (short) ((bitmask & data) >>> (16 - n));
return returnVal;
}
这适用于getBits((短)0x7000,0,4),但如果我是具有8我得到负值替换7。
解决方案
有几件事情要记住Java数据类型,使这件事情的工作。
我假设你正在使用,因为在你的表达没有显式转换的INT变量。如果您使用的是你的变量int类型:数据START_POS和长度;你应该使用32而不是16,因为INT的是32位值。
此外,如果你打算使用整数基本类型如int,short或者字节,记住这些基本类型是补是符号扩展,这意味着,如果你不喜欢〜0的负数右移(计算结果为-1)时,将那些在高阶位(符号位被附加)而不是零。
例如:
1111 1111 1111 1111 1111 1111 1111 1000
>>1
1111 1111 1111 1111 1111 1111 1111 1100
现在回到你的问题。总的想法是能够做一个:
data & mask
现在,生成掩码是上签名的数据类型需要一些技巧。它将使意义使用,以生成掩码:
(~0 << (32 - length) >> (32 - length - start_pos))
但是,当然,因为符号扩展的,这将不起作用。
我建议,而不是使用右移>>,使用旋转操作者>>>这种方式,而不是全在高阶位被附加,则循环移位操作者将追加的低阶位。
例如:
1111 1111 1111 1111 1111 1111 1111 1000
>>>1
0111 1111 1111 1111 1111 1111 1111 1100
所以...
mask = (~0 << 32-length >>> 32-length-start_pos)
和你的最后答案看起来是这样的:
(data & (~0 << 32-length >>> 32-length-start_pos)) >>> start_pos
在最外面的旋转操作移动您的屏蔽数据的低位比特。
其他提示
不知道为什么你需要使用短。下面是使用长的溶液中。
public static long getBits(long data, int p, int n) {
assert p >= 0 && p < 64;
assert n >= 0 && n < 64;
return (data >> p) & ((1 << n) - 1);
}
不隶属于 StackOverflow