如何在python 3中给定特定的二进制数来迭代和计算每个位的值?
例如:
00010011
--------------------
bit position | value
--------------------
[0] false (0)
[1] false (0)
[2] false (0)
[3] true (1)
[4] false (0)
[5] false (0)
[6] true (1)
[7] true (1)
答案 0 :(得分:8)
使用位时最好使用bitwise operators:
number = 19
num_bits = 8
bits = [(number >> bit) & 1 for bit in range(num_bits - 1, -1, -1)]
这会为您提供8个数字的列表:[0, 0, 0, 1, 0, 0, 1, 1]
。迭代它并打印所需的任何内容:
for position, bit in enumerate(bits):
print '%d %5r (%d)' % (position, bool(bit), bit)
答案 1 :(得分:5)
Python字符串是序列,因此您可以像使用列表一样循环遍历它们。添加enumerate()
,您自己也有一个索引:
for i, digit in enumerate(binary_number_string):
print '[{}] {:>10} ({})'.format(i, digit == '1', digit)
演示:
>>> binary_number_string = format(19, '08b')
>>> binary_number_string
'00010011'
>>> for i, digit in enumerate(binary_number_string):
... print '[{}] {:>10} ({})'.format(i, digit == '1', digit)
...
[0] False (0)
[1] False (0)
[2] False (0)
[3] True (1)
[4] False (0)
[5] False (0)
[6] True (1)
[7] True (1)
我在这里使用了format()
而不是bin()
,因为您不必在开始时处理0b
,而是可以更轻松地包含引导0
。
答案 2 :(得分:1)
令人惊讶的是,将整数转换为字符串比使用二进制运算要快得多。在运行MacOS 10.15和Python 3.7.6的Core i9上进行基准测试:
702221444796383454 90
"".join()
方法的运行时间是按位运算符方法的60%! (如果添加if-else以获得整数列表而不是布尔值,也不会有太大改变。)
我认为这是因为Python整数以不允许有效的按位运算的方式存储在幕后。
答案 3 :(得分:0)
此列表理解将为您提供所需的数据。你还希望它在表格下格式化吗?
>>> [(i, b=='1', b) for i, b in enumerate('00010011')]
[(0, False, '0'), (1, False, '0'), (2, False, '0'), (3, True, '1'),
(4, False, '0'), (5, False, '0'), (6, True, '1'), (7, True, '1')]
答案 4 :(得分:0)
为什么要打扰字符串?此代码用于8位,但更改它应该是显而易见的:
num = 19
bits = [False for i in range(8)]
for i in range(8):
bits[7-i] = True if num & 1 else False
num = num >> 1
print(bits)
答案 5 :(得分:0)
num=19
for val in [bool(num & (1<<n)) for n in range(8)]:
print(val)
# do stuff