好的,先来这里发帖,所以如果问题不可行,请原谅并忽略;
背景: 我从事计算机科学160.从高中开始,我没有上过任何与计算机相关的课程,所以加入这门课程对我来说是一个很大的转变。这一切看起来都非常先进。我们一直在使用Python,每周都会提示我们编写一个程序。
我已经解决了这个问题一个多星期了,即使开始也很难 提示是读取仅包含1和0的整数, 逐位处理二进制数并报告十进制等效值。现在,我从同学那里得到了一些提示,它至少给了我一个指示。
设置几个柜台;
使用%
运算符检查数字的剩余部分除以2,并切掉最后一个数字(向右)以继续前进并处理下一个数字。
我非常难以绕过在二进制数字本身上使用的公式,这会将数字转换为十进制。
setbitval = 0
counter = 0
user = int(input("enter a binary value. "))
if user % 2 == 1:
user = (user/10) - .1
setbitval += 1
这就是我到目前为止所做的一切......我的想法正在阻碍。我甚至通过这些论坛进行了搜索和搜索。
非常感谢任何信息或想法,
Ť
编辑:好的家伙,每个人的帮助都非常有用,但我在检查用户输入是否不是二进制数时遇到问题。
for i in reversed(bits):
decimal += 2**counter * int(i)
counter += 1
这是有人在这里给我的公式,我一直在尝试不同的迭代“for i in bits:if i in bits:!= 0或1”以及“if i in bits:> = 1或者< = 0"
。
有什么想法吗?
答案 0 :(得分:1)
您可以使用此代码:
binary= raw_input("Binary: ")
d= int(binary, 2)
print d
答案 1 :(得分:0)
要将二进制值转换为十进制,您需要执行以下操作:
取最低有效位并乘以2 ^ 0,然后取下一个最低有效节拍并乘以2 ^ 1,然后乘以2 ^ 2,依此类推......
假设您需要将数字1010转换为十进制数:
你会有0 * 2 ^ 0 + 1 * 2 ^ 1 + 0 * 2 ^ 2 + 1 * 2 ^ 3 = 0 + 2 + 0 + 8 = 10
所以在你的python代码中,你需要:
以下代码演示了我刚刚尝试解释的内容:
user_input = int(input("enter a binary value"))
bits = list(str(user_input))
decimal = 0
counter = 0
for i in reversed(bits):
decimal += 2**counter * int(i)
counter+=1
print 'The decimal value is: ', decimal
答案 2 :(得分:0)
我同意这对我来说很接近这个代码"领土,但我会尝试以一种让你走上正确轨道的方式回答,而不是仅仅发布一个有效的代码片段。
这样做的一个简单方法就是使用int()
的基本参数,但我猜测这是不允许的。
您已经有办法测试问题中的当前位,即检查是否n % 2 == 1
。如果是这种情况,我们需要增加2的幂。
然后,我们需要某种方式进入下一位。在二进制中,我们会使用位移,但遗憾的是,我们没有那些。 a >> b
相当于a // (2**b)
- 你能写一个等效的十进制数吗?
您还需要保持一个计数器,该计数器表示当前位表示的2的幂,循环以及检测结束条件的某种方式。这些留给读者练习。
答案 3 :(得分:0)
我建议您阅读维基百科上的以下文章: https://en.wikipedia.org/wiki/Radix https://en.wikipedia.org/wiki/Binary_number
第一个让您了解数字系统的工作原理,第二个解释并显示在二进制和十进制系统之间进行转换的公式。 阅读本文后尝试实施解决方案。这就是我处理这个问题时的所作所为。如果这没有用,请告诉我,我会发布代码。
希望这段代码能够澄清一些事情。
x = input("Enter binary number: ").strip()
decimal = 0
for i in range(len(x)):
decimal += int(x[i]) * 2**abs((i - (len(x) - 1)))
print(decimal)
此代码将二进制数作为字符串,将其转换为十进制数并将其作为整数输出。程序如下:
二进制数的第一个元素* 2 ^(二进制数的长度 - 1)
二进制数的第二个元素* 2 ^(二进制数的长度 - 2)
依此类推,直到我们到达最后一个元素并且...... 2 ^ 0
如果我们使用数字10011,使用此公式的转换将如下所示: 1 * 2 ^ 4 + 0 * 2 ^ 3 + 0 * 2 ^ 2 + 1 * 2 ^ 1 + 1 * 2 ^ 0,等于19。
但是,此代码假定二进制数有效。如果有帮助,请告诉我。
使用while循环的另一个实现可能如下所示。也许它比使用for循环的代码更容易理解。
x = input("Enter binary number: ").strip()
decimal = 0
index = 0
exp = len(x) - 1
while index != len(x):
decimal += int(x[index]) * 2**exp
index += 1
exp -= 1
print(decimal)
在这一个中,我们从具有最高功率的数字的开头开始,即二进制数的长度减去一个,我们遍历数字,降低功率和改变索引。
关于检查数字是否为二进制。 尝试使用辅助函数来确定数字是否为二进制,然后在主函数中插入此函数。例如:
def is_binary(x):
""" Returns True if number x is binary and False otherwise.
input: x as a string
"""
for i in list(x):
if i not in ["1", "0"]:
return False
return True
def binary_decimal(x):
""" Converts binary to decimal.
input: binary number x as a string
output: decimal number as int
"""
if not is_binary(x):
return "Number is invalid"
decimal = 0
for i in range(len(x)):
decimal += int(x[i]) * 2**abs((i - (len(x) - 1)))
return decimal
第一个函数检查数字是否仅由1和0组成,第二个函数实际上仅在根据第一个函数为二进制时转换您的数字。 如果数字不是二进制而不是简单地打印消息,你也可以尝试使用assert语句或try / except,如果你最好引发错误。
当然,您可以在没有任何功能的情况下实施此解决方案。