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

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

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

主要是位运算!

#include <cstdint>
#include <iostream>
#include <vector>
using namespace std;

vector<int> getnum(const string &in){ //输入的string类型IP地址放到vector
    vector<int> out;
    out.clear();
    string num;
    for(auto &i:in){
        if(i!='.'&& i>='0'&&i<='9'){
            num+=i;
        }
        else if(i=='.'){
            out.emplace_back(stoi(num));
            num.clear();
        }
        else{
            num.clear();
            out.clear();
            break;
        }
    }
    if(!num.empty()) out.emplace_back(stoi(num));
    return std::move(out);
}

bool isip(const vector<int> &in){//判断是不是合法ip
    for(auto &i:in){
        if(i<0 || i>255){
            return false;
        }
    }
    return true;
}

bool ismask(const vector<int> &in){//判断掩码是否合法
    if(!isip(in)){
        return false;
    }
    uint32_t musk;
    musk=(in[0]<<24) |(in[1]<<16)|(in[2]<<8)|in[3];
    musk = ~musk;//取反
    return ((musk & (musk + 1)) == 0);
}

uint32_t vtoi32(const vector<int> &in){//把vector类型的ip地址转成32位二进制无符号整数
    return (in[0]<<24) |(in[1]<<16)|(in[2]<<8)|in[3];
}

//判断是否属于相同子网
bool ismatch(const vector<int> &m,const vector<int> &a,const vector<int> &b)
{
    uint32_t c = vtoi32(m) & vtoi32(a);
    uint32_t d = vtoi32(m) & vtoi32(b);
    return c == d;
}

int main() {
    string m, a, b;
    while (cin >> m >> a >> b) { // 注意 while 处理多个 case
        vector<int> vm = getnum(m);
        vector<int> va = getnum(a);
        vector<int> vb = getnum(b);
        if(vm.empty() || va.empty() || vb.empty()){
            cout<<1<<endl;
            continue;
        }
        if(!(ismask(vm) && isip(va) && isip(vb))){
            cout<<1<<endl;
            continue;
        }
        if(ismatch(vm,va,vb)){
            cout<<0<<endl;
        }
        else{
            cout<<2<<endl;
        }
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

10-10 00:14
门头沟学院 Java
程序员小白条:20年架构师,无工资
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务