#python #binary
#python #двоичный
Вопрос:
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)
Я пытаюсь создать двоичный калькулятор.
Я полагаю, что у меня работает степенная часть уравнения, поскольку она начинается с 2 ^ 0, затем 2 ^ 1 для следующей цифры и так далее. Но у меня возникли проблемы с получением первой части уравнения, самой правой цифры введенного значения.
Итак, допустим, был введен 0101. Я хочу 1 * (2 ^ 0) в первом цикле, 0 * (2 ^ 1) во втором цикле и так далее; справа налево. Итак, учитывая, как работает индексация в Python, как я могу изменить индекс, чтобы [4] было в первом цикле, затем [3] во втором цикле и так далее.
Спасибо за помощь.
Комментарии:
1. Просто для справки, вы всегда можете использовать
int(value,base=2)
. Однако, если вы просто хотите использовать это как упражнение, правильным способом было бы выполнить итерацию по строке (не по индексам) в обратном порядке:for bit in reversed(value):
2. Кроме того, в вашем цикле нет необходимости в
prod = 0
. Иpower 1
должно бытьpower = power 1
илиpower =1
. Или еще лучше, сделайтеfor power, bit in enumerate(reversed(value)):
и не нужно иметь дело с увеличением.3. Я ценю помощь. Но я совсем новичок в этом, и у меня возникли проблемы с поиском того, куда именно поместить предложенный вами код.
prod = 0
удалено, и теперьpower = power 1
. Хотя я не могу найти, куда поместитьfor power, bit in enumerate(reversed(value)):
Это для замены цикла for?4. ДА. В python, если вам не нужен индекс , не перебирайте что-то вроде
for i in range(len(something)):
, а просто используйтеfor thing in something:
Ответ №1:
Однако есть варианты получше, я предполагаю, что вы очищаете свои основы. Ниже могут быть варианты:
Примечание: В цикле следует использовать len (значение) вместо int (значение).
# 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]
Комментарии:
1. Всем привет. Большое спасибо за вашу помощь. Я использую ваш второй пример и смотрю на код цикла
for i in range (-1,-len(value) - 1,-1):
. Я просто хочу убедиться, что я понимаю, что это на самом деле делает. Прав ли я, говоря, что он начинается со значения индекса -1 (самого правого), а затем для каждого цикла добавляется -1? Чтобы затем сделать -2 и так далее?
Ответ №2:
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, поэтому мы используем len()
для получения длины введенной строки. -1
это потому, что длина строки может быть равна 3 для ввода 001
, но если индексирование 3 выйдет за рамки, потому что индексирование начинается с 0, а не с 1
Обратите внимание, что в Python принимается отрицательное значение индекса. Отрицательный индекс означает, что начинается с конца списка и отсчитывается в обратном направлении, поэтому я думаю, что это был ответ, который вы искали.
Например, если у нас есть список, my_list=['a','b','c']
и мы вызываем my_list[-2]
, он вернет 'b'
Ответ №3:
В вашем коде есть некоторые ошибки, поэтому замените их этим:
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 = 7
27 // 10 = 2
Комментарии:
1. Я бы не рекомендовал
while
цикл в этом случае. Это не очень хороший стиль Python и менее эффективный. Есть некоторые случаи, когдаwhile
цикл необходим, но они, как правило, редки в python.2. Пожалуйста, подумайте о том, чтобы принять и поддержать ответы, которые были полезны для вас.
Ответ №4:
Более простой способ добиться этого с помощью упоминания 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
Комментарии:
1. Я сделал что-то похожее на это, но теперь кажется, что вычисления выполняются в обратном направлении. Например, 100 = 1, вместо 4.
2. @AAGW: Ранее была некоторая проблема с логикой моего кода. Обновлен код функции. Проверьте сейчас