讨论/技术交流/面试题目|IP 地址与 int 整数的转换 - 腾讯 PCG TEG 都考过的一道题/
面试题目|IP 地址与 int 整数的转换 - 腾讯 PCG TEG 都考过的一道题

前言

今天继续为大家补充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地址。

整数转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;
    }
    reverse(ipList.begin(), ipList.end());
    for(int i = 0; i < 4; i ++) {
        if(i == 3) res += ipList[i];
        else res += ipList[i] + '.';
    }
    return res;
}
int main()
{
    string ip;
    unsigned num;
    cin >> ip;
    cin >> num;
    cout << ipToInt(ip) << endl;
    cout << intToIp(num) << endl;
}
11
共 0 个回复
暂无回复