关于前端: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地址。

以下是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;
    }

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理