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

时间:2015-08-21 01:16:29

标签: java bit-shift bitmask

我试图将一个字节中的一定数量的位传输到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变量。

1 个答案:

答案 0 :(得分:1)

这应该做你想要的(我已经改变了一些变量名)。请注意,您必须传入currBitsUsed >= lencurrb位移位的值。

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