5

在给定 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)
4

6 回答 6

14

使用位时最好使用位运算符:

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)
于 2013-05-20T23:54:19.797 回答
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在开始时处理,你可以更容易地包含leading 0

于 2013-05-20T23:42:20.217 回答
2

令人惊讶的是,将整数转换为字符串比使用二进制运算要快得多。在运行 MacOS 10.15 和 Python 3.7.6 的 Core i9 上进行基准测试:

In [6]: number = 1 << 30

In [7]: num_bits = 32

In [8]: %timeit bits = [c == '1' for c in format(number, f'0{num_bits}b')]
1.84 µs ± 8.51 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [9]: %timeit bits = [(number >> bit) & 1 for bit in range(num_bits - 1, -1, -1)]
3.13 µs ± 69.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

format()方法的运行时间是按位运算符方法的 60%!(如果您添加一个 if-else 来获取整数列表而不是布尔值,它也不会发生太大变化。)

我认为这是因为 Python 整数在幕后存储的方式不允许有效的按位运算。

于 2020-08-13T02:48:12.277 回答
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)
于 2013-05-20T23:52:50.813 回答
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')]
于 2013-05-20T23:44:12.013 回答
0
num=19

for val in [bool(num & (1<<n)) for n in range(8)]:
    print(val)
    # do stuff
于 2018-10-02T10:42:27.053 回答