我不明白为什么我的程序不输出128.255.3.15输入为10000000111111110000001100001111。
代码:
#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()发布于 2020-08-21 21:20:09
问题就在这条线上-
decimal = decimal*2 + int(digit)小数点被初始化为0,而您没有正确地执行它。您只是在添加双小数点+任何数字is...which是不正确的逻辑。要从二进制转换到十进制,逻辑很简单-
(2^position from right starting with 0)*binary digit添加到十进制.,
我已经对你的代码做了修改,现在它应该可以正常工作了-
#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()输出:
Please enter a 32 digit number: ['10000000', '11111111', '00000011', '00001111']
128 . 255 . 3 . 15发布于 2020-08-21 21:11:02
为什么不简单地使用int函数呢?
>>> int('100', 2)
4因此,您只需将您的主要功能更改为如下内容:
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!!")发布于 2020-08-21 21:13:30
这是因为计算和的公式不正确,而且每次迭代都要覆盖decimal:
decimal = decimal*2 + int(digit)0111 = 0_2^3 + 1_2^2 + 1_2^1 + 1_2^0
还有另一个arg,你可以提供给int(),以得到你需要的.
int('0111', 2) = 7https://stackoverflow.com/questions/63529997
复制相似问题