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

问题描述 投票:0回答:8

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

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

我需要朝相反的方向走。我的教授说,当他检查我们的代码时,他要输入

11001
,他应该得到
25
。我浏览了我们的笔记,但我不知道如何做到这一点。谷歌和其他互联网资源也没有多大帮助。

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

python python-2.7 binary integer base-conversion
8个回答
93
投票

您可以使用

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
>>>

34
投票

二进制转十进制

int(binaryString, 2)

十进制转二进制

format(decimal ,"b")

ps:我理解作者不想要内置函数。但即使对于那些对内置功能没问题的人来说,这个问题也会出现在谷歌提要上。


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)

时间对比:

该人工智能解决方案转换数字的速度几乎比传统方式快 10 倍!


3
投票

如果您想要/需要在没有

int
的情况下进行:

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

这会反转字符串 (

s[::-1]
),获取每个字符
c
及其索引
i
(
for i, c in enumerate(
),将字符 (
int(c)
) 的整数乘以 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
投票

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

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

# 8

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)

-1
投票

使用 power (

**
) 功能有点浪费,所以 @user2555451 的解决方案确实是可行的方法 (Horner 的方法)。这是它的一个奇特的变体(不过效率较低,因为字符串需要反转。
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)))

© www.soinside.com 2019 - 2024. All rights reserved.