Python二进制算术

时间:2016-03-05 22:10:37

标签: python math binary

我一直在用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)

3 个答案:

答案 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))

而不是枚举各个位,第一个循环计数从02^5-11<<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的回答。非常优雅,也许更快。但它有很多东西要消化。