我需要将字节值中的特定位存储为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 = 0b01000011
和bitShift = 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遮罩(同样,您不能将
return
与void
一起使用,但是我假设这是一个错字)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/