我需要一个存储为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,二进制)。我在这里做错了什么?
答案 0 :(得分:4)
出于某种原因,当我尝试你的代码时,我得不到你得到的东西。对于您的示例,如果您说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
}
答案 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.