我正在编写一个函数short getBits(short data,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( (short) 0x7000,0,4)有效,但如果我用8替换7,我会得到一个负值。
发布于 2009-06-30 05:15:20
关于java数据类型,有几件事需要记住,才能让它正常工作。
我假设你使用int变量,因为你的表达式中没有显式的类型转换。如果您的变量使用int类型: data start_pos和length;您应该使用32而不是16,因为int是32位值。
此外,如果您要使用int、short或byte等整数基元类型,请记住这些基元类型是符号扩展的2的补码,这意味着如果对~0 (计算结果为-1)这样的负数进行右移,1将被附加到更高阶位(符号位),而不是0。
例如:
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))但这当然不会起作用,因为有sign扩展。
我建议使用旋转运算符>>>,而不是使用右移位>>,而不是将1附加到高位,旋转运算符将附加低位。
例如:
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最外层的旋转操作将被屏蔽的数据移动到低位。
发布于 2009-11-02 00:11:39
不确定为什么需要使用short。这是一个使用long的解决方案。
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);
}https://stackoverflow.com/questions/1061528
复制相似问题