java 将偏移量和长度的位从 byte 传输到 int

java transfer bits at offset and length from byte to int

我正在尝试将一个字节中的一定数量的位传输到一个 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 和长度 3 应该产生 int> 00000000000000000000000000000110

我只需要将这些位放在 int 的开头,但我需要将之前分配给左侧的任何位移动,这样它们就不会被覆盖,因此需要 bitsInUse 变量。

这应该做你想做的(我已经改变了一些变量名)。请注意,您必须传递 currBitsUsed >= len 的值,否则移位后的 currb 位会发生冲突。

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);
}