如何在Java中提取特定位?

时间:2014-05-07 16:50:27

标签: java bit-shift

我需要一个存储为int值的字节值中的特定位。我的代码如下所示。

private int getBitValue(int byteVal, int bitShift){
    byteVal = byteVal << bitShift;
    int bit = (int) (byteVal >>>7);
    return bit;
}

当我将bitshift设为1时工作,但是当我将bitshift设为2且byteVal设为67(二进制为01000011)时,我得到&#39; byteVal&#39;作为268,而#byte; byteVal&#39;在方法的第一行(左移)之后应该是3(000011,二进制)。我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

出于某种原因,当我尝试你的代码时,我得不到你得到的东西。对于您的示例,如果您说byteVal = 0b01000011bitShift = 2,那么这就是我得到的:

byteVal = 0b01000011 << 2 = 0b0100001100
bit = (int) (0b0100001100 >>> 7) = (int) (0b010) // redundant cast
returned value: 0b010 == 2

我相信你打算做的是将你想要的位移到最左边的位置,然后将它一直移到右边以获得位。但是,由于以下几个原因,您的代码不会这样做:

  1. 您需要向左移动(variable length - bitShift)才能获得所需的位置。所以在这种情况下,你真正想要的是将byteVal向左移动 6 ,而不是2。
  2. int个变量是32位宽,而不是8个。(所以你实际上想要将byteVal向左移动 30 位置)
  3. 此外,您的问题似乎有点矛盾。你声明你想要一个特定的位,但你的例子意味着你想要bitShift - 最低有效位。

    获取特定位的一种更简单的方法可能是根据需要简单地向右移动,然后使用1进行掩码:(另外,您不能将returnvoid一起使用,但我认为这是一个错字)

    private int getBitValue(int byteVal, int bitShift) {
        byteVal = byteVal >> bitShift; // makes the bitShift-th bit the rightmost bit
                                       // Assumes bit numbers are 0-based (i.e. original rightmost bit is the 0th bit)
        return (int) (byteVal & 1) // AND the result with 1, which keeps only the rightmost bit
    }
    

    如果你想要bitShift - 最不重要的位,我相信这样的东西会起作用:

    private int getNthLSBits(int byteVal, int numBits) {
        return byteVal & ((1 << numBits) - 1);
        // ((1 << numBits) - 1) gives you numBits ones
        // i.e. if numBits = 3, (1 << numBits) - 1 == 0b111
        // AND that with byteVal to get the numBits-th least significant bits
    }
    

答案 1 :(得分:0)

我很好奇为什么答案应该是3,我认为我们需要更多关于函数应该做什么的信息。

假设你想要byteVal的最低bitShift位的值,我会做以下几点。

private int getBitValue(int byteVal, int bitShift){
    int mask = 1 << bitShift;  // mask = 1000.... (number of 0's = bitShift)
    mask--;                     // mask = 000011111 (number of 1's = bitShift)
    return (byteVal & mask);
}

至少,此函数将为getBitValue(67,1)返回1,为getBitValue(67,2)返回3.