我试图将一个字节中的一定数量的位传输到int的开头,但是它没有按计划运行。
public int transfer(byte b, int offset, int len, int dest, int bitsInUSe){
byte mask = (byte) ((byte) ((1 << len) - 1) << offset);
dest = dest<< bitsInUSe;
dest = b & mask;
return dest ;
}
例如,对于字节00111000的偏移2和len 3,应该产生int&gt;
00000000000000000000000000000110
我只需要将这些位放在int的开头,但是我需要移动之前分配给左边的任何位,这样它们就不会被覆盖,因此就是bitsInUse变量。
答案 0 :(得分:1)
这应该做你想要的(我已经改变了一些变量名)。请注意,您必须传入currBitsUsed >= len
或curr
和b
位移位的值。
public int transfer(byte b, int offset, int len, int curr, int currBitsUsed) {
byte mask = (byte)((1 << len) - 1);
return (curr << currBitsUsed) | ((byte)((b) >>> offset) & mask);
}
这是一个自动计算要转移curr
以避免冲突的位数的版本。
public int transfer(byte b, int offset, int len, int curr) {
int currShift = Math.max(32 - Integer.numberOfLeadingZeros(curr), len);
byte mask = (byte)((1 << len) - 1);
return (curr << currShift) | ((byte)((b) >>> offset) & mask);
}