前言
明天持续为大家补充Leetcode没有的高频面试题:IP地址与int整数的转换
援用几篇面经原文形容
- 给你一个IP4的地址,请转成十进制整数 (2021-03 腾讯-PCG-前端)
- 手撕算法: ip地址转整数 (2021-03 腾讯-TEG-后端)
- ip字符串转整型(2021-02 快手-效率工程-后端)
5min的工夫,带你把握这个题。
题目形容
ip地址与整数的转换。
例如,ip地址为10.0.3.193,把每段拆分成一个二进制模式组合起来为00001010 00000000 00000011 11000001,而后把这个二进制数转变成十进制整数就是167773121。
题目剖析
借助位运算实现。如IP10.0.3.193,将10左移24位,0左移16位,3左移8位,193左移0位。4个seg或运算,即为后果。
上代码,python 7行代码就能够实现(为不便了解,代码没有应用循环)
def ipToInt(ip): ipList = ip.split(".") seg0 = int(ipList[0]) << 24 seg1 = int(ipList[1]) << 16 seg2 = int(ipList[2]) << 8 seg3 = int(ipList[3]) return seg0 | seg1 | seg2 | seg3
留神:C++实现时,后果要应用无符号整数。否则,高位为1时,后果会显示正数。
咱们再来看一下如何将整数转成IP。
将整数和255做与运算,后果为IP的第4段。整数右移8位,和255做与运算的后果就是IP的第3段...最初再将每轮与运算的后果拼接起来便是最终的IP地址。
以下是python代码的实现(为不便了解,代码没有应用循环)
def intToIp(num): res = [] res.append(str(num & 255)) res.append(str(num>>8 & 255)) res.append(str(num>>16 & 255)) res.append(str(num>>24 & 255)) res.reverse() return ".".join(res)
参考代码
以下附上C++版的参考代码
#include <iostream>#include <vector>#include <algorithm>using namespace std;unsigned ipToInt(string ip) { int l = ip.size(); vector<int> ipList; //split for (int i = 0; i < l; i++) { int j = i; while (j < l && ip[j] != '.') j++; ipList.push_back(stoi(ip.substr(i, j - i))); i = j; } int n = ipList.size(); unsigned res = 0; for (int i = 0; i < n; i++) { res = res << 8 | ipList[i]; } return res;}string intToIp(unsigned num) { vector<string> ipList; string res = ""; for(int i = 0; i < 4; i ++) { string seg = to_string(num & 255); ipList.push_back(seg); num = num >> 8; }