我需要在不使用bin的情况下将二进制转换为十进制的帮助

时间:2019-10-07 00:09:31

标签: python python-3.x

我必须在编码班上做一个菜单。用户可以在菜单上选择一个数字,并且菜单可以关闭。除了二进制到十进制之外,我所有的东西都记下来了。到目前为止,我的代码如下所示。

base10是我正在研究的。我只是不知道要获得它的代码,因为我不得不错过课,而他在课堂上全神贯注了。

#Name: Menu
#Input: 
#Output:
#Description:
def menu():
  while(True):
    print("Welcome The Menu")
    print("\t 1. Convert Binary to Decimal")
    print("\t 2. Convert Decimal to Binary")
    opt=input("Input a number or 9 to Quit. ")
    if(int(opt)==1):
      base10()
    elif(int(opt)==2):
      base2()   
    elif(int(opt)=="9"):
      break;
  else:
    print("Invalid Input")

#Name: Reverse
#Input: String s
#Output: String r
#Description: This function takes a string as input and reverses that string
#returning it as output. 

def reverse():
  r=""
  for i in s:
    r=i + r
  return r

#Name: Base 10
#Input:
#Output:
#Description

def base10():
  num=int(input("Enter a binary number:"))

  sum=0
  for i in range(0,len()):
      sum+=(int([i])*(2**i))
  print(sum)


#Name: Base 2
#Input: num
#Output: b
#Description: It takes the number from the user and divides it by two. B is the binary number and num is the decimal number.

def base2():
  b=""
  num=int(input("Enter a decimal number: "))
  while(num != 0):
    b=str(num % 2) + b
    num=num // 2
    int(num == 10)
    print(b)

menu()

期望的结果是我在菜单中输入数字以选择二进制到十进制或十进制到二进制。然后,我应该可以输入base2base10的数字,然后反过来。 (我不能使用bin!)

2 个答案:

答案 0 :(得分:2)

(正)整数的二进制表示形式可以看作是加权和。

考虑1011 = 11。

1011
abcd

In other words: a = c = d = 1
           and: b = 0

可以表示为加权和:

8 * a + 4 * b + 2 * c + 1 * d

通过按定义插入a,b,c,d,您将得到11,但是查看加权和的另一种方法是:

(2**3)*a  +  (2**2)*b  +  (2**1)*c  +  (2**0)*d

 (2**3)*a  +  (2**2)*b  +  (2**1)*c  +  (2**0)*d
     └ exponent   └ exponent   └ exponent   └ exponent

在这里,2升到指数递减,乘以二进制数字。

换句话说:

(2**3)*1 + (2**2)*0 + (2**1)*1 + (2**0)*1 == 11

首先反转字符串可能更容易,然后指数从零开始向上计数:

(2**0)*1 + (2**1)*1 + (2**2)*0 + (2**3)*1 == 11

假设您在变量binstr中使用了二进制字符串,而没有付出太多,我将看一下以下内容的输出:

print(list(enumerate(reversed(binstr))))

for (i, x) in enumerate(reversed(binstr)):
    print(i, x)

一种方法可能最终看起来像这样:

intval = sum(<something> for (i,x) in enumerate(reversed(binstr)))

但这不是唯一的方法。还有其他方法,包括使用reduce(或类似方法)。

当然,总会有int(binstr, 2),但我猜也是不允许的。

答案 1 :(得分:1)

int构造函数接受一个可选的基数。您可以将base10重写为

def base10():
  num = int(input("Enter a binary number:"), 2)
  print(num )

通常用bin完成另一种转换。另一种方法是一一检查数字的位。您的base2实现已经结束,但是您不应在循环中进行打印。

类似的东西:

output = []
while num:
    output.append(num % 2)
    num //= 2
print(''.join(reversed(output)))

另一种方法是使用int的{​​{3}}方法以及一个简单但又容易扭曲的操作,以正确的顺序创建数字:

b = ''.join(str(int(bool(num & (1 << n)))) for n in range(num.bit_length() - 1, -1, -1))

怪物str(int(bool(num & (1 << n))))将2的幂的位标志转换为布尔值,然后使用布尔值的整数表示来生成0或{{1} }。等同于进行1