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
我想知道序列中的某个位是 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