我需要编写一个从 Byte 缓冲区中读取可变位数的方法,并将这些字节转换为原始int
或long
(如果超过32)位)。我不太熟练使用位,但我确实看了一些代码示例和类似(ish)问题的答案,这是我能想到的最好的(bb
指的是内部{{1 }}):
ByteBuffer
public int readBits(int number) {
int initialPosition = bb.position();
int value = 0;
int remaining = number;
int position = bb.position();
while (remaining > 0) {
int index = (position >> 3);
int bit = (position & 7);
int bitsLeft = Math.min(8 - bit, remaining);
int nibble = (bb.get(index) >> (bit & BIT_MASKS[bitsLeft]));
value |= nibble << (number - remaining);
position += bitsLeft;
remaining -= bitsLeft;
}
bb.position(initialPosition + ((position - initialPosition) >> 3));
return value;
}
数组定义如下:
BIT_MASKS
我使用此测试代码测试了此方法:
private static final int[] BIT_MASKS = new int[] { 0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff };
我预计值为6,但它打印12,我不知道为什么。
我很感激这方面的一些帮助。感谢。