我想查找序列中的位是1还是0(true或false) 如果我有一个11010011的位序列,我怎么能检查第4个位置是真还是假?
示例:
10010101 (4th bit) -> False
10010101 (3rd bit) -> True
答案 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