题目:
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数。 举例:一个ip地址为10.0.3.193 每段数字 相对应的二进制数 10 00001010 0 00000000 3 00000011 193 11000001 组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。 本题含有多组输入用例,每组用例需要你将一个ip地址转换为整数、将一个整数转换为ip地址
代码:
while True :
try:
#str1 = '10.0.3.193'.split('.')
str1 = input().split('.') #输入IP地址,并用'.'进行分割
str2 = str(bin(int(input()))).split('b')[-1] #输入转换后的IP地址,将其转换成二进制
list1 = []
for i in str1: #将每一段IP地址中的数字转换成二进制
erjizhi = str(bin(int(i))).split('b')[-1]
#print(erjizhi)
if len(erjizhi) <= 8: #判断每一个二进制字长是否为8,小于8的话用0进行填充
erjizhi = '0' * (8 - len(erjizhi)) + erjizhi
#print(erjizhi)
list1.append(erjizhi) #将二进制数添加到list1列表中
#print(''.join(list1))
print(int(''.join(list1),2)) #对lsit1中的元素进行拼接
dic1 = {} #生成一个空字典
#print(str2)
# str1 = '1010000000110000001111000001'
if len(str2) < 32: #判断转换后的IP地址转换成二进制后,字长是否小于32, 因为有效个的IP分为4段,每一段转换为8位的二进制的话,最大是8*4=32字节长
str2 = '0' * (32 - len(str2)) + str2 #不满足的话用0进行填充,就得到了32字长的二进制数字
#print(str2)
len1 = int(len(str2) / 8) #把32字长的二进制数字进行切割,使其每一段长度为8,分割成4分。
# print(len1)
# print(type(len1))
for i in range(0, len1):
dic1[i] = str2[8 * (i):8 * (i + 1)]
# print(dic1)
# print(int('11000001', 2))
for key in dic1.keys(): #将分割的4段二进制存在dic1字典中,并转换成10进制。
dic1[key] = int(dic1[key], 2)
#print(dic1)
res = []
for value in dic1.values(): #将转换成4段十进制的数字添加到res列表中去
res.append(str(value))
print('.'.join(res)) #使用“.”对4个二进制熟悉进行拼接,并打印出来
except:
break