将二进制转换为十进制整数输出

41

我需要将二进制输入转换为十进制整数。我知道如何从十进制转换为二进制:

n = int(raw_input('enter a number: '))
print '{0:b}'.format(n)

我需要倒转方向。我的教授说,当他检查我们的代码时,他将输入11001,然后应该得到25。我已经看过我们的笔记,但是我无法弄清楚如何做到这一点。谷歌和其他互联网资源也没有太大帮助。

最大的问题是,我们不允许使用内置函数。我理解为什么不允许使用它们,但这使得这个问题更加困难,因为我知道Python有一个用于二进制转十进制的内置函数。


看看这里。Grace L. Samson的答案可能会有用。 - user8611285
8个回答

94

您可以使用int函数,并将基数设置为2(表示二进制):

>>> binary = raw_input('enter a number: ')
enter a number: 11001
>>> int(binary, 2)
25
>>>

然而,如果您不能像那样使用int,那么您总是可以这样做:

binary = raw_input('enter a number: ')
decimal = 0
for digit in binary:
    decimal = decimal*2 + int(digit)
print decimal

下面是演示:

>>> binary = raw_input('enter a number: ')
enter a number: 11001
>>> decimal = 0
>>> for digit in binary:
...     decimal = decimal*2 + int(digit)
...
>>> print decimal
25
>>>

1
有些东西告诉我他的教授希望他自己编写转换器而不是使用现有的函数。不过如果有一个优雅的解决方案,就点赞支持一下吧。 - OutFall
就像N0ir所说的那样。我编辑了帖子以澄清这一点。否则,这个问题会容易得多。 - purlinka
@iCodez - 我尝试了你在编辑后的帖子中添加的代码。不知何故它不起作用?显示为无效语法。(顺便说一句,感谢你的帮助) - purlinka
@purlinka - 嗯,这很奇怪。我的代码语法没问题。你复制对了吗?另外,请记住你不能只是将我的演示复制粘贴到解释器中。你需要像运行普通脚本一样运行它。 - user2555451
工作得很好,使用以下在线数字转换器进行验证 - https://randomtools.io/binary-to-decimal/ - user2475624

34
二进制转十进制
int(binaryString, 2)

十进制转二进制
format(decimal ,"b")
ps:我明白作者不想要内置的功能。但是这个问题甚至在谷歌的反馈中也会出现,即使对于那些接受内置功能的人来说。

5
Python有一个名为bin()的函数,可以将十进制数转换为二进制字符串。例如:bin(26)的结果为0b11010,该函数从Python 2.6开始引入。 - CodeMonkey
@CodeMonkey:代码更短确实值得点赞,但是生成的字符串中有0b前缀,这可能不是所有人都想要的。 - cegprakash

16

实际上,有一种更快的方法可以将二进制数转换为十进制,这种方法基于人工智能(线性回归)模型:

  1. 训练一个AI算法,以32位二进制数为基础进行十进制转换。
  2. 预测32位二进制数对应的十进制表示。

请参见以下示例和时间比较:

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import numpy as np

y = np.random.randint(0, 2**32, size=10_000)

def gen_x(y):
    _x = bin(y)[2:]
    n = 32 - len(_x)
    return [int(sym) for sym in '0'*n + _x]

X = np.array([gen_x(x) for x in y])

model = LinearRegression()
model.fit(X, y)

def convert_bin_to_dec_ai(array):
    return model.predict(array)

y_pred = convert_bin_to_dec_ai(X)

时间比较:

enter image description here

这个AI解决方案将数字转化的速度比传统方法快近10倍!


6
你是否曾考虑过,NumPy数组比Python列表更快? - univalence
1
当然,您可以使用传统的智能和numpy中惊人快速的点积来实现这一点,但请思考一下,如果您现在想要转换为三进制甚至四进制(!)表示法,那该怎么办呢?使用常规方法,您需要考虑所有这些正确的系数和乘数,而使用AI,它只需为您完成工作! - Anvar Kurmukov
很好!争议:这是线性回归,而不是逻辑回归,对吧? - Peter Drake
4
当我试图在技术面试中使用这个时,面试官的表情。 - marzano

3

如果你希望/需要不使用 int 来完成这个操作:

sum(int(c) * (2 ** i) for i, c in enumerate(s[::-1]))

这个操作会先翻转字符串(s[::-1]),然后获取每个字符 c 和它的索引 ifor i, c in enumerate()),接着将字符的整数值乘以 2 的指数幂(2 ** i),最后把它们全部加在一起(sum())。


0

很久以前,我开始着手解决这个问题,试图编写自己的二进制转十进制的函数。不过,事实上我并不知道如何将十进制转换为二进制!今天我重新思考了一下,并找到了解决方案,以下是我得出的结果。我不确定这是否符合你的需求,但还是提供给你参考:

def __degree(number):
    power = 1

    while number % (10**power) != number:
        power += 1

    return power

def __getDigits(number):
    digits = []
    degree = __degree(number)

    for x in range(0, degree):
        digits.append(int(((number % (10**(degree-x))) - (number % (10**(degree-x-1)))) / (10**(degree-x-1))))
    return digits

def binaryToDecimal(number):
    list = __getDigits(number)
    decimalValue = 0
    for x in range(0, len(list)):
        if (list[x] is 1):
            decimalValue += 2**(len(list) - x - 1)
    return decimalValue

再次强调,我仍在自学Python,希望这能对你有所帮助。第一个函数确定数字的位数,第二个函数实际上计算它们并将它们返回为一个列表,第三个函数是您实际上需要调用的,它可以计算出十进制值。如果您的老师真的想让您编写自己的转换器,那么这个程序可以工作,我没有测试过每个数字,但似乎完美运行!我相信你们都会替我找到错误的!所以无论如何,我只是这样调用它:

binaryNum = int(input("Enter a binary number: "))

print(binaryToDecimal(binaryNum))

这将打印出正确的结果。干杯!


0
a = input('Enter a binary number : ')
ar = [int(i) for  i in a]
ar  = ar[::-1]
res = []
for i in range(len(ar)):
    res.append(ar[i]*(2**i))
sum_res = sum(res)      
print('Decimal Number is : ',sum_res)

感谢@V.Gokul的有效答案,但您能否对其进行一些解释?似乎OP @purlinka在理论上遇到了困难。基本上,请解释这里正在发生什么:res.append(ar[i]*(2**i))。谢谢! - tahesse
1
它将用它们各自的 2 ** i 值乘以二进制数的每个数字。例如,对于 ar [:: -1] 上的 0010 -> 0100,并计算 ((0)(2**0))+((1)(2**1))+.. - V. Gokul
1
你应该将那个编辑到答案本身,而不是作为评论发布。 - Tomerikoo

0

输入可以是字符串或整数。

num = 1000  #or num = '1000'  
sum(map(lambda x: x[1]*(2**x[0]), enumerate(map(int, str(num))[::-1])))

# 8

-1

使用幂函数(**)有点浪费,所以@user2555451的解决方案确实是正确的方法(霍纳法则)。这里有一个花哨的变体(效率较低,因为需要反转字符串。str强制转换是为了允许整数也能被传递):

from itertools import accumulate, repeat
from operator import mul

def bin2dec(bin_str):
    return sum(
        int(n) * m for n, m in zip(
            str(bin_str)[::-1],
            accumulate((repeat(2)), func=mul, initial=1)))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接