我写一个函数短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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top