在python中将二进制转换为十进制(没有内置二进制函数)

时间:2017-11-15 23:00:52

标签: python binary

好的,先来这里发帖,所以如果问题不可行,请原谅并忽略;

背景: 我从事计算机科学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"
。 有什么想法吗?

4 个答案:

答案 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代码中,你需要:

  • 读取用户输入的int(表示二进制值)。
  • 转换该int并将其转换为字符串,因此您可以将其分解为数字列表
  • 从您创建的字符串中创建一个数字列表(可以从字符串而不是int创建一个列表int python,这就是您需要先转换为字符串的原因)
  • 反过来通过该位列表并将每个位乘以2 ^ k,k是从0开始的计数器

以下代码演示了我刚刚尝试解释的内容:

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,如果你最好引发错误。

当然,您可以在没有任何功能的情况下实施此解决方案。