2016-09-28 60 views
0

我知道有一個內置函數將二進制轉換爲十進制,但我想我自己挑戰自己並做出自己的想法。如何在將二進制轉換爲十進制時避免無效令牌

這裏是代碼:

def binaryToDecimal(binary): 
    binaryList = list(str(binary)) 
    exponent = len(binaryList) - 1 
    decimal = 0 

    for char in binaryList: 
     bit = int(char) 
     decimal += bit * (2 ** exponent) 
     exponent -= 1 

    print(decimal) 

的問題是,我必須使用前綴0b,避免無效的令牌,我知道,如果我要開始我的二進制0,但它使我的問題。它不轉換的最後1左側

binaryToDecimal(0b010001110) 

因此它輸出的14,而不是142

我該如何解決呢?也有我可以說的一種方式

binaryToDecimal(010001110) 

沒有得到一個無效的令牌,而不使用0b前綴?

我使用Python 3.5

+5

我不是當然如果你知道的話,但是'0b010001110'在內部沒有任何區別,它與'142'不同。它們都被存儲爲完全普通的整數。 'list(str(0b010001110))'只是給你'['1','4','2']'。 – Kevin

+0

'list(str(0b010001110))'不會做你認爲它做的事。 –

+1

他們說什麼。你得到14是因爲'exponent'從2開始,14 = 4 * 1 + 2 * 4 + 2。如果你真的想做自己的二進制轉換函數,你需要將二進制arg作爲字符串傳遞,例如「010001110」。或者,正如Aaron所建議的那樣,可以是整數的位列表。 –

回答

0

特殊照顧的問題主要是binaryList = list(str(binary))str(0b010001110)返回'142',而不是您所期望的'0b101010'。因此,binaryList['1', '4', '2']

巧合使1 * 2**2 + 4 * 2**1 + 2等於14,這給人的印象是你的功能不處理最後一位數字。

但是,如果您運行的是0b101010作爲輸入功能,則會得到10

的溶液,以獲得二進制表示爲字符串傳遞給format

list("{0:b}".format(0b010001110)) 

它返回

['1', '0', '0', '0', '1', '1', '1', '0'] 
+0

好的,我明白了,謝謝 – acubal

1

0b010001110是已經與142的十進制值。如果一個整數你真的想做自己的二進制轉換函數,你需要將字符串中的二進制arg作爲字符串傳遞,例如'010001110',或者作爲一個位列表,可以是字符串,整數或者甚至是布爾值TrueFalse

一旦你有strint輸入問題解決,有一個更簡單的方法來進行轉換。沒有必要亂用指數:在循環中,將當前結果左移一位並插入下一位。就像這樣:

def bin_to_int(bits): 
    result = 0 
    for b in bits: 
     result = (result << 1) | int(b) 
    return result 

# Test 
data = [ 
    '0', 
    '1', 
    '110', 
    '001101', 
    '10001110', 
    '000010001110', 
    '11000000111001', 
] 

for bits in data: 
    print(bits, int(bits, 2), bin_to_int(bits)) 

輸出

0 0 0 
1 1 1 
110 6 6 
001101 13 13 
10001110 142 142 
000010001110 142 142 
11000000111001 12345 12345 

我的測試代碼使用內置的int構造函數來執行轉換爲好,以驗證我的bin_to_int功能工作正常。

這條線,其中大部分工作的,使用位運算符,

result = (result << 1) | int(b) 

,但你可以用「正常」的算術運算符實現它,如果你喜歡

result = result * 2 + int(b) 
相關問題