我需要将字节值中的特定位存储为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)时,它起作用了,我将'byteVal'的值设置为268,而'byteVal'应为3(000011在二进制中)在方法的第一行之后(向左移动)。我在这里做错了什么?

最佳答案

出于某种原因,当我尝试您的代码时,我没有得到您所得到的。对于您的示例,如果您说byteVal = 0b01000011bitShift = 2,那么我得到的是:

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


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


您需要向左移动(variable length - bitShift)以将所需的位移到所需的位置。因此,在这种情况下,您真正​​想要的是将byteVal左移6位,而不是2位。
int变量是32位宽,而不是8位。(因此,您实际上想将byteVal左移30位)


此外,您的问题似乎有些矛盾。您声明需要一个特定的位,但是您的示例暗示您想要第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
}

关于java - 如何提取Java中的特定位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23523722/

10-10 13:27