首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试用二进制输入输出十进制

尝试用二进制输入输出十进制
EN

Stack Overflow用户
提问于 2020-08-21 21:01:11
回答 5查看 83关注 0票数 0

我不明白为什么我的程序不输出128.255.3.15输入为10000000111111110000001100001111

代码:

代码语言:javascript
复制
#function to read a number

def readNum():

    binary = input("Please enter a 32 digit number: ")
    return binary

#function to check to make sure there are 32 digits

def checkNum(binary):

    while len(binary) != 32:
           flag = 'error'
           return flag
    else:
           flag = 'true'
           return flag

#function to split the number into 4 strings and 8 bits

def splitNum(binary):

    first = binary[0:8]
    second = binary[8:16]
    third = binary[16:24]
    fourth = binary[24:32]
    return [first, second, third, fourth]


#function to check to see if they are all numbers and calculate sum

def calcSum(first):

    decimal = 0
    binary = 0
    digit = 0
    flag = 'true'
    for digit in first:
           try:
                  decimal = int(digit)
           except ValueError:
                  flag = 'error'
                  break;
           else:
                  decimal = decimal*2 + int(digit)
    if flag == 'true':
           return decimal
    else:
           print("Not a valid number.")

#main function

def main():

    flag = 'true'
    myList = []
    binary = readNum()
    flag = checkNum(binary)
    if flag == 'true':
           myList = splitNum(binary)
           part1 = calcSum(myList[0])
           part2 = calcSum(myList[1])
           part3 = calcSum(myList[2])
           part4 = calcSum(myList[3])
           print(part1, ".", part2, ".", part3, ".", part4)
    else:
           print("Not a valid 32 digit number!!")

#call main
main()
EN

回答 5

Stack Overflow用户

发布于 2020-08-21 21:20:09

问题就在这条线上-

代码语言:javascript
复制
decimal = decimal*2 + int(digit)

小数点被初始化为0,而您没有正确地执行它。您只是在添加双小数点+任何数字is...which是不正确的逻辑。要从二进制转换到十进制,逻辑很简单-

  1. 采用二进制数。初始化一个变量,比如十进制到0.

  1. 继续将- (2^position from right starting with 0)*binary digit添加到十进制.

  1. ,你得到了等价的小数。简单!

我已经对你的代码做了修改,现在它应该可以正常工作了-

代码语言:javascript
复制
#function to read a number

def readNum():

    binary = input("Please enter a 32 digit number: ")
    return binary

#function to check to make sure there are 32 digits

def checkNum(binary):

    while len(binary) != 32:
           flag = 'error'
           return flag
    else:
           flag = 'true'
           return flag

#function to split the number into 4 strings and 8 bits

def splitNum(binary):

    first = binary[0:8]
    second = binary[8:16]
    third = binary[16:24]
    fourth = binary[24:32]
    print([first, second, third, fourth])
    return [first, second, third, fourth]


#function to check to see if they are all numbers and calculate sum

def calcSum(first):
    decimal = 0
    tmp =0
    pos = 0
    flag = 'true'
    for digit in first[::-1]:
           try:
                  tmp = int(digit)
                  # Further error/validity checking
                  if tmp != 0 or tmp != 1:  
                      flag = 'error'
                      break
           except ValueError:
                  flag = 'error'
                  break;
           else:
                  decimal += (2**pos)*tmp
           pos+=1
    if flag == 'true':
           return decimal
    else:
           print("Not a valid number.")

#main function

def main():

    flag = 'true'
    myList = []
    binary = readNum()
    flag = checkNum(binary)
    if flag == 'true':
           myList = splitNum(binary)
           part1 = calcSum(myList[0])
           part2 = calcSum(myList[1])
           part3 = calcSum(myList[2])
           part4 = calcSum(myList[3])
           print(part1, ".", part2, ".", part3, ".", part4)
    else:
           print("Not a valid 32 digit number!!")

#call main
main()

输出:

代码语言:javascript
复制
Please enter a 32 digit number: ['10000000', '11111111', '00000011', '00001111']
128 . 255 . 3 . 15
票数 1
EN

Stack Overflow用户

发布于 2020-08-21 21:11:02

为什么不简单地使用int函数呢?

代码语言:javascript
复制
>>> int('100', 2)
4

因此,您只需将您的主要功能更改为如下内容:

代码语言:javascript
复制
def main():
    flag = 'true'
    binary = readNum()
    flag = checkNum(binary)
    if flag == 'true':
        nums = map(lambda num: int(num, 2), splitNum(binary))
        print('.'.join(nums))
    else:
        print("Not a valid 32 digit number!!")
票数 0
EN

Stack Overflow用户

发布于 2020-08-21 21:13:30

这是因为计算和的公式不正确,而且每次迭代都要覆盖decimal

代码语言:javascript
复制
decimal = decimal*2 + int(digit)

0111 = 0_2^3 + 1_2^2 + 1_2^1 + 1_2^0

还有另一个arg,你可以提供给int(),以得到你需要的.

代码语言:javascript
复制
int('0111', 2) = 7
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63529997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档