字节串中的特定索引处有一个字节,表示八个标志;字节中每位一个标志。如果设置了一个标志,则其对应的位为1,否则为0.例如,如果我有
b'\x21'
标志将是
0001 0101 # Three flags are set at indexes 0, 2 and 4
# and the others are not set
获取该字节中每个位值的最佳方法是什么,所以我知道是否设置了特定的标志? (最好使用按位运算)
答案 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