【问题标题】:Converting binary to decimal integer output将二进制转换为十进制整数输出
【发布时间】:2014-03-13 00:18:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 检查this。 Grace L. Samson 的回答可能有用

标签: python python-2.7 binary integer base-conversion


【解决方案1】:

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

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

【讨论】:

  • 你有没有想过numpy数组比python列表快很多?
  • 当然,你可以使用传统的智能和点积在 numpy 中速度惊人的事实来做到这一点,但是想一想,如果你现在想转换为 base-3 甚至是 base -4(!)符号?使用常规方法,您需要考虑所有这些正确的系数和乘数,而使用 AI,它只会为您完成这项工作!
  • 漂亮! Quibble:这是线性回归,不是逻辑回归,对吧?
  • 我在技术面试中尝试使用它时面试官面临的问题
  • @PeterDrake,对,谢谢,已修复
【解决方案2】:

二进制转十进制

int(binaryString, 2)

十进制转二进制

format(decimal ,"b")

【讨论】:

  • Python 有bin() 函数将十进制转换为二进制字符串。 bin(26) => # '0b11010' 在 Python 2.6 中引入。
【解决方案3】:
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))Thanks!
  • 它将二进制数的每个数字乘以它们各自的 2i 值例如 ar[::-1] 上的 0010 -> 0100 和 ((0)*(20))+((1)*(2**1))+..
  • 你应该edit回答本身,而不是作为评论发布
【解决方案4】:

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

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

# 8

【讨论】:

    【解决方案5】:

    我很久以前就开始研究这个问题,尝试编写自己的二进制到十进制转换器函数。我实际上不知道如何将十进制转换为二进制!我今天才重新审视它并弄清楚了,这就是我想出的。我不确定这是否是您需要的,但这里是:

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

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

    【讨论】:

      【解决方案6】:

      您可以使用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
      >>>
      

      【讨论】:

      • 某事告诉我,他的教授希望他自己编写转换器,而不是使用现有函数。支持一个优雅的解决方案
      • 正是 N0ir 所说的。我编辑了帖子以澄清这一点。否则,这个问题会容易得多。
      • @iCodez - 我尝试了您添加到已编辑帖子中的代码。由于某种原因它不起作用?说它是无效的语法。 (谢谢你的帮助,顺便说一句)
      • @purlinka - 嗯,这很奇怪。我的代码语法很好。你抄对了吗?另外,请记住,您不能只是将我的演示复制/粘贴到解释器中。您需要将其作为普通脚本运行。
      【解决方案7】:

      如果你想/需要在没有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())。

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 2012-06-26
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多