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

#include <bitset>
#include <iostream>
#include <regex>
#include <sstream>
#include <string>
using namespace std;

static regex netReg(
    R"(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))");
bool isVaildIp(const string& ip) {
    return regex_match(ip, netReg);
}

bool isVaildMask(const string& mask) {
    if (!regex_match(mask, netReg)) return false;

    stringstream ss(mask);
    string segment;
    unsigned long binaryMask = 0;
    while (getline(ss, segment, '.')) {
        binaryMask = (binaryMask << 8) | stoi(segment);
    }
    //cout << binary << endl;

    bitset<32> b(binaryMask);
    bool found = false;
    for (int i = 31; i >= 0; --i) {
        if (!b.test(i)) {
            found = true;
        } else if (found) {
            return false;
        }
    }
    return !(binaryMask == 0 || binaryMask == 0xFFFFFFFF);;

}
bitset<32> andOperate(const string ip, const string mask) {
    stringstream ss(mask);
    string segment;
    unsigned long binaryMask = 0;
    while (getline(ss, segment, '.')) {
        binaryMask = (binaryMask << 8) | stoi(segment);
    }
    bitset<32> bmask(binaryMask);

    stringstream ss2(ip);
    string segment2;
    unsigned long binaryIp = 0;
    while (getline(ss2, segment2, '.')) {
        binaryIp = (binaryIp << 8) | stoi(segment2);
    }
    bitset<32> bip(binaryIp);

    return  bip & bmask;

}
int main() {
    string  mask, ip1, ip2;
    while (cin >> mask >> ip1 >> ip2) { // 注意 while 处理多个 case
        if (isVaildMask(mask) && isVaildIp(ip1) && isVaildIp(ip2)) {
            cout << (andOperate(ip1, mask) == andOperate(ip2, mask) ? 0 : 2) << endl;
        } else {
            cout << 1 << endl;
        }

    }
}

全部评论

相关推荐

05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务