题解 | #判断两个IP是否属于同一子网#

判断两个IP是否属于同一子网

http://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

先判断子网掩码的正确性,之后再判断两个ip的正确性,代码通俗易懂

#include<iostream>
#include<sstream>
#include<vector>
#include<string>

using namespace std;

int isbelong(vector<int> &mask, vector<int> &ip1, vector<int> &ip2){
    for(int i = 0; i <4; i++){
        if((mask[i]&ip1[i]) != (mask[i]&ip2[i]))return 2;
    }
    return 0;
}

vector<int> ismask(string input){
    stringstream iss(input);
    string temp;
    unsigned m = 0;
    vector<int> mask;
    while(getline(iss, temp, '.')){
        m = (m<<8) + stoi(temp);
        mask.emplace_back(stoi(temp));
    }

    if(m == 0 || (m^(m-1)) == 1 || ((m&(m-1)) != (m<<1)) ){//判断子网掩码网络号是否全1,主机号是否全0
        mask.clear();              //子网掩码全0或者全1都不行
    }
    return mask;
    
}
vector<int> isip(string input){
    stringstream iss(input);
    string temp;
    vector<int> ip;
    while(getline(iss, temp, '.')){
        ip.emplace_back(stoi(temp));
    }
    for(auto i:ip){
        if(i < 0 || i >255){
            ip.clear();
            break;
        }
    }
    return ip;
}

int main(){
    string inputs[3];
    while(cin>>inputs[0]>>inputs[1]>>inputs[2]){
        vector<int> mask = ismask(inputs[0]);
        if(mask.empty() || mask.size() != 4){
            cout<<1<<endl;
            continue;
        }
        vector<int> ip1 = isip(inputs[1]);
        if(ip1.empty() || ip1.size() != 4){
            cout<<1<<endl;
            continue;
        }
        vector<int> ip2 = isip(inputs[2]);
        if(ip2.empty() || ip2.size() != 4){
            cout<<1<<endl;
            continue;
        }
        cout<<isbelong(mask, ip1, ip2)<<endl;
    }
    return 0;
}
全部评论
(m^(m-1)) 这种算法真的,学到了。
点赞 回复 分享
发布于 2022-07-03 16:18
if(m == 0 || (m^(m-1)) == 1 || ((m&(m-1)) != (m<<1)) )大佬能具体解释一下为什么满足这三个条件之一,子网掩码就不合法吗
点赞 回复 分享
发布于 2023-05-14 17:00 江苏
牛的,简洁易懂
点赞 回复 分享
发布于 03-12 19:54 上海

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-12 10:48
已编辑
秋招之苟:邻居家老哥19届双2硕大厂开发offer拿遍了,前几天向他请教秋招,他给我看他当年的简历,0实习实验室项目技术栈跟开发基本不沾边😂,我跟他说这个放在现在中厂简历都过不了
点赞 评论 收藏
分享
6 1 评论
分享
牛客网
牛客企业服务