字节串中的特定索引处有一个字节,表示八个标志; 字节中每位一个标志.如果设置了一个标志,则其对应的位为1,否则为0.例如,如果我有
b'\x21'
Run Code Online (Sandbox Code Playgroud)
旗帜将是
0001 0101 # Three flags are set at indexes 0, 2 and 4
# and the others are not set
Run Code Online (Sandbox Code Playgroud)
获取该字节中每个位值的最佳方法是什么,所以我知道是否设置了特定的标志?(最好使用按位运算)
Mic*_*yan 26
通常,最低有效位是位索引0并且最高有效位是位索引7.使用该术语,我们可以通过取位数来确定位索引k是否被设置,并且1向左移位k.如果按位且非零,则表示索引k具有1; 否则,索引k有一个0.所以:
def get_bit(byteval,idx):
return ((byteval&(1<<idx))!=0);
这将正确地确定字节的索引0 ... 7处的位值,从右到左(即最低有效位到最高有效位,或等效地从1位到2 7 = 128)地点).
为什么它有效
我想我应该添加一个解释为什么它的工作原理...
1 << 0是1 = 0000 0001
1 << 1是2 = 0000 0010
1 << 2是4 = 0000 0100
正如您所看到的,1 << k相当于2 k,并且在我们感兴趣的索引处包含1而在其他位置.因此,按位和1 << k将返回0或1 << k; 如果我们感兴趣的索引处的位是0(因为1和0是0,并且1 << k中的所有其他位都是0),它将为0.如果我们感兴趣的位是1,那么我们在该位置得到1和1,在其他地方得到0等等.