Appearance
整数与IP地址间的转换
本节目标:理解“整数与IP地址间的转换”的核心思路,并能把它用于实际开发或面试表达。 中等 通过率:36.75% 时间限制:1秒 空间限制:32M 知识点==字符串====模拟== 描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数。 举例:一个ip地址为10.0.3.193 每段数字 相对应的二进制数 10 00001010 0 00000000 3 00000011 193 11000001 组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。 数据范围:保证输入的是合法的 IP 序列 输入描述: 输入 1 输入IP地址 2 输入10进制型的IP地址 输出描述: 输出 1 输出转换成10进制的IP地址 2 输出转换后的IP地址 示例1 输入: 10.0.3.193167969729 ==复制== 输出: 16777312110.3.3.193
def ip_to_long(ip): """ 将点分十进制的IP地址转换为长整数 :param ip: 点分十进制的IP地址,如'192.168.1.1' :return: 对应的长整数 """ ip2num = 0 # 初始化IP长整数 for part in ip.split('.'): # 分割IP地址为四个部分 ip2num = ip2num * 256 + int(part) # 每个部分转为整数,并累加到长整数 return ip2num
def long_to_ip(num): """ 将长整数转换回点分十进制的IP地址 :param num: IP地址对应的长整数 :return: 点分十进制的IP地址 """ num2ip = [] # 初始化存储每部分IP的列表 for i in range(3, -1, -1): # 从高位到低位处理每一部分
通过整除256的幂得到每个部分的值,并将其转换为字符串添加到列表
num2ip.append(str(num // (256 ** i)))
通过取模256的幂更新num,移除已处理的部分
num = num % (256 ** i) return '.'.join(num2ip) # 将列表中的字符串用点连接成完整的IP地址
读取输入,并处理异常
while True: try: ip_input = input().strip() # 删除可能的首尾空白字符 num_input = input().strip()
转换并打印IP地址到长整数的结果
print(ip_to_long(ip_input))
转换并打印长整数到IP地址的结果
print( long_to_ip(int(num_input))) except EOFError: # 使用EOFError来捕捉输入结束的情况 break except ValueError: # 捕捉输入值异常
ip2num = ip2num ***** 256 + int**(part)** 一个IP地址由四个数字组成,每个数字称为一个“段”。每个段的取值范围是0到255,即一个八位的二进制数。例如,IP地址192.168.1.1可以分成四个段:192,168,1,1。
在计算机中,这些数字会转换成二进制形式。让我们来看192.168.1.1这个地址各个段的二进制形式是什么:
192->11000000168->101010001->000000011->00000001
每个段转换为二进制后都是8位,因为最大值255用二进制表示正好是11111111,即8个1。
现在,我们要将这四个二进制数拼接起来,形成一个长二进制数。拼接的结果就是这个IP地址的二进制表示。按照上面的例子,拼接后的结果是:
11000000 10101000 00000001 00000001
这是一个32位的二进制数,因为每个段是8位,总共有4个段。
现在我们来到了你提到的那行代码。由于我们处理的是十进制数,而不是二进制数,我们需要一种方法来模拟这种“拼接”操作。这就是* 256(即2^8,因为一个段有8位)和+ int(part)的作用。
- 首先,我们取第一个段的值,比如
192,我们还没有其他段要处理,所以现在的数就是192。 - 然后我们要加上第二个段的值。在加之前,我们先将目前的数(
192)乘以256。这相当于在二进制中将11000000向左移动8位(因为乘以2就是向左移动一位)。所以192 * 256(或者二进制中的11000000向左移动8位)给了我们11000000 00000000。然后我们加上下一个段的值,比如168,得到11000000 10101000。 - 我们对后面的段重复这个过程,每次都先乘以
256,然后加上下一个段的值。
通过这种方式,我们模拟了将四个八位二进制数拼接起来的过程,只不过我们使用的是十进制的数学操作。
