2016-10-20 17 views
-1
value = input("Enter the binary value to convert to a decimal number.") 
prod = 0 
power = 0 
ans = 0 
for i in range (int(value)): 
    prod = ((int(value[*right most digit here*])) * ((2**power))) 
    ans = prod + ans 
    prod = 0 
    power + 1 
else: 
    print (ans) 

我想創建一個二進制計算器。如何反轉索引和-1每個循環

我相信我有權力的一部分工作,因爲它以2^0開始,然後2^1爲下一個數字等等。但是我無法獲得方程的第一部分,即輸入值的最右側數字。

假設輸入了0101。我想要1 *(2^0)在第一個循環,0 *(2^1)在第二個循環,依此類推;右到左。因此,索引如何在Python中工作,我如何反向索引它,使[4]在第一個循環中,然後在第二個循環中[3],依此類推。

感謝您的幫助。

+0

只是爲了記錄在案,你可以隨時使用'INT(值,基地= 2)'。但是,如果您只是想將其用作練習,則正確的方法是以相反的順序遍歷字符串(而不是索引):'對於反向(值)位:' –

+0

另外,不需要'prod = 0'在你的循環中。 「power + 1」應該是「power = power + 1」或「power + = 1」。或者更好的辦法是,爲了權力,列舉一下(反轉(值)):'而不需要處理遞增。 –

+0

我很感激幫助。但是我對此很陌生,而且我無法準確找到您提供的代碼的位置。 'prod = 0'被刪除,現在'power = power + 1'。雖然我無法找到在哪裏放權力,在枚舉(顛倒(價值)):「這是爲了取代for循環? – AAGW

回答

0

但是有可用更好的選擇,我假設你正在清除您的基本知識。以下是可選項:

注意:您應該在循環中使用len(value)而不是int(value)。

# 1. When starting the loop from 0 (i.e. i=0). you can use (len(value) - i)th index.' 

for i in range (len(value)): 
    prod = ((int(value[len(value) - i - 1])) * ((2**power))) 
    ans = prod + ans 
    prod = 0 
    power = power + 1 



# 2. Python also supports negative indexing, So you may run a loop from -1 to -len(value). 

for i in range (-1,-len(value) - 1,-1): 
    prod = ((int(value[i])) * ((2**power))) 
    ans = prod + ans 
    prod = 0 
    power = power + 1 


# 3. You can reverse the whole string in your first step and then loop from 0 to len(value)-1. 

value = reversed(value) 
for i in range (len(value)): 
    prod = ((int(value[i])) * ((2**power))) 
    ans = prod + ans 
    prod = 0 
    power = power + 1 

但也有在代碼中的一些錯誤(或者可能是缺乏信息)。此代碼僅適用於無符號整數。如果您希望它也可以使用帶符號的數字,則必須考慮2的補碼。 下面是一個非常簡單的代碼與符號數過工作(在需要的情況下):

#convert binary string into decimal value. Works on 2's complement. 
def binToDecimal(s): 

    neg = False 
    if s[0] == '1': 
     s = twosComp(s) 
     neg = True 
    #compute the decimal value 
    val = reduce(lambda x,y : int(x)*2+1 if y=='1' else int(x)*2,'0'+s) 
    #negate the value if the first bit is 1 
    return -val if neg else val 


#return the 2's complement string 
def twosComp(s): 
    s = list(s[::-1]) 
    #take 1's complement 
    s = ['1' if i=='0' else '0' for i in s] 
    #take 2's complement 
    for i in range(len(s)): 
     if s[i] == '0': 
      #no carry will be generated in this case, so we break it. 
      s[i] = '1' 
      break 
     else: 
      s[i]='0' 

    # return 2's complement string 
    return ''.join(map(str,s))[::-1] 
+0

你好。非常感謝你的幫助。我正在使用你的第二個例子,我在範圍(-1,-len(value) - 1,-1):'中查看循環代碼'。我只是想確保我明白這實際上在做什麼。我是否正確地說它從索引值-1開始(最右邊),然後對於每個循環,-1都加上?然後使-2等等? – AAGW

+0

@AAGW,沒錯。你做對了 !!! – Shasha99

0

更簡單的方法來做到這一點是提到base作爲2與int()。例如:

>>> num = '110' 
>>> int(num, 2) 
6 

如果你正在尋找定製的解決方案,你可以創建一個功能:

def binary_string_to_int(binary_string): 
    int_num = 0 
    for i in binary_string: 
     int_num += int(i) 
     int_num *= 2 
    return int_num/2 

採樣運行:

>>> binary_string_to_int('111') 
7 
>>> binary_string_to_int('101') 
5 
+0

我做了類似於這但現在看來計算是倒退了。例如,100 = 1,而不是4. – AAGW

+0

@AAGW:早些時候,我的代碼的邏輯存在一些問題。更新了功能代碼。現在檢查 –

0

你在你的代碼中的一些錯誤,所以用這個代替它:

value = input("Enter the binary value to convert to a decimal number: ") 
value = int(value) # conversion from string to number 

power = 0 
ans = 0 

while(value > 0): 
    lastDigit = value % 10 # last digit 
    value  = value // 10 # cutting off last digit (for next iteration) 

    prod  = lastDigit * (2 ** power) 

    ans  = prod + ans 
    power  = power + 1 

print (ans) 

的最後一個數字被計算爲10(value % 10) 分割後的剩餘部分,且由整數除以10(value // 10)切割 - 在基礎學校的第一等級:27 % 10 = 727 // 10 = 2

+0

在這種情況下,我不會推薦'while'循環。這不是很好的Python風格,效率也不高。在某些情況下,while循環是必要的,但它們在python中很少見。 –

+0

請考慮接受並提出對您有用的答案。 – MarianD

0
value = input("Enter the binary value to convert to a decimal number.") 
power = 0 
ans = 0 

for i in reversed(value): 
    prod = int(i) * (2**power) 
    ans = prod + ans 
    power += 1 
else: 
    print(ans) 

改進你的代碼,而儘可能使其儘可能接近您的代碼。你的for循環創建了一個1 to whatever the value we input的列表,這不是你應該做的。一種做法是,將輸入視爲一個字符串(基本上是一個可以迭代的列表),將其反轉,以便從右向左移動,然後在每個值上對其執行操作。您試圖獲取值輸入的位置索引的權利?爲什麼? Python很漂亮,你很可能不需要直接告訴索引的東西。

value = input("Enter the binary value to convert to a decimal number.") 
prod = 0 
power = 0 
ans = 0 
for i in range(int(len(value))-1): 
    prod = ((int(value[-1])) * ((2**power))) 
    ans = prod + ans 
    prod = 0 
    power + 1 
else: 
    print (ans) 

你正在做的價值,而不是輸入長度的範圍內,所以我們使用len()來獲取被輸入的字符串的長度。 -1是因爲有一個字符串的長度可以是3輸入001但如果索引3。將出界因爲索引從0開始而不是1

注意,在Python負指數值被接受。負指數意味着從列表的末尾開始並向後計數,所以我認爲這是您正在尋找的答案。

例如,如果我們有名單my_list=['a','b','c']我們稱之爲my_list[-2]它將返回'b'

+0

爲什麼'如果電源> 0'? –