我一直在用Python做二进制算术。这对我来说似乎很笨拙,可能是因为有更好的方法。提供的示例代码创建二进制数字列表,创建反向列表并创建绝对差异。任何有关更好技术的建议都将受到赞赏。
for (i, j, k, n, m) in [(i, j, k, n, m)for i in range(2) for j in range(2) \
for k in range(2)for n in range(2) for m in range(2)]:
s = [i, j, k, n, m] # binary sequence
r = s[::-1] # reversed sequence
sbin = '0b' # create binary number as string
rbin = '0b'
for a in range(5):
sbin += str(s[a])
rbin += str(r[a])
sbb = int(sbin,2) # create binary number
rbb = int(rbin,2)
v = abs(sbb - rbb) # take absolute difference as integers
dif = bin(v) # convert back to binary
print(sbin, rbin, dif, v)
答案 0 :(得分:1)
这是一个选项:
BITSIZE = 5
for i in range(1<<BITSIZE):
a = i
b = 0
for k in range(BITSIZE): # b = reversed_bits(a)
b <<= 1
b ^= i&1
i >>= 1
print(' {:05b} {:05b}'.format(a, b))
print(a, b, abs(a-b))
而不是枚举各个位,第一个循环计数从0
到2^5-1
(1<<5
向上移位5位,等于2^5
)。其余的只是反转位(循环超过k
)。
此输出:
00000 00000
0 0 0
00001 10000
1 16 15
00010 01000
2 8 6
00011 11000
3 24 21
00100 00100
4 4 0
00101 10100
5 20 15
...
11110 01111
30 15 15
11111 11111
31 31 0
python的二进制操作可以在这里看到:https://wiki.python.org/moin/BitwiseOperators
正如Reti43所指出的那样,这可以写得更紧凑:
BITSIZE = 5
for a in range(1<<BITSIZE):
b = 0
for k in range(BITSIZE): # b = reversed_bits(a)
b = (b << 1) | ((a >> k) & 1)
print(a, b, abs(a-b))
答案 1 :(得分:0)
正如您的绝对差异技术所示,整数运算已经在二进制中完成,因此应该尽可能地利用它。虽然签名数量可能存在问题。
我会声称你的嵌套5深度列表理解只是生成二进制1到31的数字,所以为什么不s = range(32)
做任何算术作为整数运算并使用bin
来获取二进制字符串结果
反转一串数字对于二进制算术来说通常不常见,但是通过相对简单的解决方案提出了一个有趣的问题。以下函数没有错误检查,因为它假定您只传递bin
函数的有效输出。它考虑到二进制表示始终以&#39; 0b&#39;而且你不希望这种情况发生逆转。
def reverse_binstr(b):
return b[0:2] + b[:1:-1]
答案 2 :(得分:0)
使用您自己的代码,您可以避免一些不必要的变量并简化迭代:
from itertools import product
BITS = ('0','1')
for s in product(*[BITS]*5):
sbin = ''.join(s)
diff = abs(int(sbin, 2) - int(sbin[::-1], 2))
print (sbin, sbin[::-1], diff, bin(diff))
让它看起来不那么笨拙。我喜欢hiro的回答。非常优雅,也许更快。但它有很多东西要消化。