获取字节字符串中的特定位值

时间:2010-04-07 10:06:31

标签: python binary byte

字节串中的特定索引处有一个字节,表示八个标志;字节中每位一个标志。如果设置了一个标志,则其对应的位为1,否则为0.例如,如果我有

b'\x21'

标志将是

0001 0101    # Three flags are set at indexes 0, 2 and 4
             # and the others are not set

获取该字节中每个位值的最佳方法是什么,所以我知道是否设置了特定的标志? (最好使用按位运算)

4 个答案:

答案 0 :(得分:26)

通常,最低有效位是位索引0,最高有效位是位索引7.使用此术语,我们可以通过按位并且向左移位1来确定是否设置了位索引k由k。如果按位且非零,则表示索引k具有1;否则,索引k有一个0.所以:

def get_bit(byteval,idx):
    return ((byteval&(1<<idx))!=0);

这将正确地确定字节的索引0 ... 7处的位值,从右到左(即最低有效位到最高有效位,或等效地从1位到2位) 7 = 128个地方)。

为什么会这样?
我想我应该补充一下它为何有效的解释......

1 <&lt; 0&lt; 0是1 = 0000 0001
1 <&lt;&lt; 1是2 = 0000 0010
1 <&lt;&lt;&lt; 2是4 = 0000 0100

正如您所看到的,1&lt;&lt; k相当于2 k 并且在我们感兴趣的索引中包含1而在其他位置。因此,按位且1&lt;&lt;&lt; k将返回0或1 <&lt;&lt; k;如果我们感兴趣的索引处的位是0(因为1和0是0,并且1&lt;&lt; k中的所有其他位都是0),它将为0。如果我们感兴趣的位是1,那么我们在该位置得到1和1,在其他地方得到0等等。

答案 1 :(得分:6)

x&amp; 1,x&amp; 2,x&amp; 4,x&amp; 8等等

如果那些> 0,则设置位1,2,3,4等

答案 2 :(得分:3)

指定位掩码(阅读bit masks on Wikipedia):

FLAG_1 = 1  # 0000 0001
FLAG_2 = 2  # 0000 0010
FLAG_3 = 4  # 0000 0100
...

然后使用AND检查是否设置了一个位(flags包含您的字节):

if(flags & FLAG_1) { # bit 0 is set, example: 0001 0101 & 0000 0001 = 0000 0001

}
if(flags & FLAG_2) { # bit 1 is set, example: 0001 0101 & 000 0010 = 0000 0000

}
...

当然,您应该将FLAG_1, etc命名为有意义的内容,具体取决于上下文。例如。 ENABLE_BORDER

<强>更新
我对你的评论感到困惑,哪些位被设置,但在读完另一个答案后,我意识到你正在计算错误结束的位。位从右侧开始编号为零。

答案 3 :(得分:0)

该函数将是:

def get_site_value(byteval, index):
  ''' Function to get local value at a given index''' 
  return (byteval >> index) &1