2016-03-05 69 views
2

我一直在Python中做二進制算術。對我來說這似乎很笨拙,可能是因爲有更好的方法。提供的示例代碼創建一個二進制數字列表,創建反向列表並創建絕對差異。任何建議更好的技術將不勝感激。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

拼寫錯誤的二進制標題對不起,可能限制迴應 – Graybits

回答

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 

蟒蛇的二進制運算可以在這裏看到: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)) 
+0

在我看來,'對於範圍(BITSIZE):b =(b << 1) | ((a >> k)&1)''是更直接和清晰。 – Reti43

+0

@ Reti43更新了包含您的位反轉算法的答案。謝謝! –

0

由於您的絕對差異技術演示s,整數算術已經用二進制完成了,所以應該儘可能地利用它。儘管可能存在簽名數量的問題。

我會要求你的嵌套深5列表理解只是生成從1數到31的二進制那麼爲什麼不s = range(32)做任何運算的整數運算,並使用bin得到的結果二進制字符串。

顛倒一串數字通常不是二進制算術中常見的事情,但是對於相對簡單的解決方案而言會造成一個有趣的問題。以下函數沒有錯誤檢查,因爲它假定您只會傳遞bin函數的有效輸出。它考慮到二進制表示總是以'0b'開始,並且你不希望被顛倒。

def reverse_binstr(b): 
    return b[0:2] + b[:1:-1] 
0

使用自己的代碼,就可以避免一些unnecesary變量和簡化迭代:

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的回答。非常優雅,也許更快。但它對我來說有很多消化。

+0

我感謝你的海報爲你的偉大的代碼示例。我從每篇文章中學到了一些新東西。 – Graybits