python检查顺序中的位是true还是false

时间:2015-02-18 18:03:01

标签: python bits

我想查找序列中的位是1还是0(true或false) 如果我有一个11010011的位序列,我怎么能检查第4个位置是真还是假?

示例:

10010101 (4th bit) -> False
10010101 (3rd bit) -> True

6 个答案:

答案 0 :(得分:6)

没有慢速字节移位:

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    

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

答案 1 :(得分:5)

您可以使用位移

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

答案 2 :(得分:4)

bits = 0b11010011

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

答案 3 :(得分:4)

按位左移和按位AND运算符是你的朋友。 通常,您可以检查第n位是否设置/未设置如下:

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

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

答案 4 :(得分:3)

bits = '1110111'

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

答案 5 :(得分:1)

假设整数,如果您正在计算左手(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