python 检查序列中的位是真还是假

python check if bit in sequence is true or false

我想知道序列中的某个位是 1 还是 0(真或假) 如果我有一些字节序列 11010011,我如何检查第 4 个位置是 True 还是 False?

示例:

10010101 (4th bit) -> False
10010101 (3rd bit) -> True
bits = 0b11010011

if bits & (1 << 3):
    ...

您可以使用位移

>>> 0b10010101 >> 4 & 1
1
>>> 0b10010101 >> 3 & 1
0

没有移位:

if bits & 0b1000:
    ...

编辑: 实际上,(1 << 3) 已被编译器优化。

>>> dis.dis(lambda x: x & (1 << 3))
  1           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               3 (8)
              6 BINARY_AND          
              7 RETURN_VALUE        
>>> dis.dis(lambda x: x & 0b1000)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (8)
              6 BINARY_AND          
              7 RETURN_VALUE    

这两个解决方案是等效的,请选择在您的上下文中看起来更具可读性的那个。

bits = '1110111'

if bits[-4] == '0':
    print "......false"
else:
    print  "....true"

按位左移和按位与运算符是您的朋友。 一般来说,您可以检查第 n 位是否为 set/unset,如下所示:

if (x & (1<<n)) 
  ## n-th bit is set (1)

else 
  ## n-th bit is not set (0)

假设整数,如果您计算左手 (LH),则最高有效位 (MSB) 到右手 (RH) 租赁有效位 (LSB):

def check_bitL2R(byte, bit):
    return bool(byte & (0b10000000>>bit))

如果你想将 LSB 计算到 MSB,请反转:

def check_bitR2L(byte, bit):
    return bool(byte & (0b1<<bit))

然后检查:

fmt='{:^5} {:^5} {:^5}'
print fmt.format(*'bit  LSB  MSB'.split())
for bit in range(8):
    print fmt.format(bit, check_bitR2L(0b10010101, bit), check_bitL2R(0b10010101, bit)) 

打印:

 bit   LSB   MSB 
  0     1     1  
  1     0     0  
  2     1     0  
  3     0     1  
  4     1     0  
  5     0     1  
  6     0     0  
  7     1     1