对具有 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
我正在 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