对具有 n 个输入的二进制数进行逻辑运算的 Pythonic 方法

Pythonic way to do logic operations on binary numbers with n number of inputs

我正在 python 中编写数字逻辑程序,并且对对二进制数进行逻辑运算的最佳实践方法很感兴趣。理想情况下,我想比较来自任意数量输入的位,例如 - [1011、0101、1001] 等 - 并计算结果。

下面是对几个 8 位字进行 AND 运算的一些尝试。仅在第二次尝试中,我是否能够比较两个以上的二进制数,但这种方法对我来说看起来很糟糕。我真的不在乎二进制数最初是表示为字符串还是整数(在这里的每次尝试中我都需要转换为另一种类型)。如前所述,我想找到一个 pythonic 的方法来做到这一点。

无论如何,这是我笨拙的第一次尝试...;)

# Attempt 1 - compute result for each bit/element in string, and create a new string

# inputs
a = '10100001'
b = '10101101'

bits = 8

result = ''
for i in range(bits):
    new_bit = int(a[i]) & int(b[i])
    result = result[:i] + str(new_bit) + result[i:]

print result



# Attempt 2  - for each bit in each input, check if 0 or 1.. if 0, the new_bit is 0, otherwise, the new_bit = 0

inputs = ['11000001', '11001011', '11101101']

bits = 8

result = ''
for i in range(bits):
    new_bit = '1'
    for iput in inputs:
        if iput[i] == '0':
             new_bit = '0'
     
    result = result[:i] + str(new_bit) + result[i:]

print result



# Attempt 3 - 

bits = 8

# inputs
a = int('00001001', 2)   
b = int('00001101', 2)  

result = bin(a & b).split('0b', 1)[1].zfill(8) 

print result

为了简洁起见,我倾向于第三次尝试,但不太确定如何处理具有两个以上输入的东西。

任何建议将不胜感激,谢谢。

使用reduce()对列表的所有元素执行重复操作。

from functools import reduce

inputs = ['11000001', '11001011', '11101101']
inputs = [int(i, 2) for i in inputs] # Convert from binary string to number

result = reduce(lambda x, y: x & y, inputs) # combine them with AND
print(f"{result:08b}") # print result as 8-bit binary with leading zeroes