29

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

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

我需要朝相反的方向走。我的教授说,当他检查我们的代码时,他会输入11001,他应该25回来。我浏览了我们的笔记,但我无法弄清楚如何做到这一点。谷歌和其他互联网资源也没有太大帮助。

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

4

8 回答 8

73

您可以使用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
>>>
于 2014-02-13T21:24:33.017 回答
24

二进制转十进制

int(binaryString, 2)

十进制转二进制

format(decimal ,"b")
于 2019-12-11T16:15:47.650 回答
14

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

  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)

时间比较:

在此处输入图像描述

这种 AI 解决方案的数字转换速度几乎是传统方式的 10 倍!

于 2020-08-21T13:11:42.883 回答
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 ** i),然后将它们加在一起 ​​( sum())。

于 2014-02-13T21:32:32.500 回答
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))

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

于 2015-03-20T11:21:51.220 回答
0

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

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

# 8
于 2015-08-08T10:48:21.150 回答
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)
于 2018-08-23T05:56:16.653 回答
-1

使用 power ( **) 函数有点浪费,所以@user2555451 的解决方案确实是要走的路(霍纳的方法)。这是它的一个奇特的变体(尽管效率较低,因为需要反转字符串。str-cast 也允许传递整数):

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

于 2022-01-27T15:27:19.317 回答