题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <iostream> #include <cctype> #include <string> #include <sstream> #include <vector> using namespace std; bool isValidIPAddress(const string &ip) { istringstream iss(ip); string segment; unsigned count = 0; while (getline(iss, segment, '.')) { if (segment.empty() || segment.size() > 3) { return false; } for (char ch : segment) { if (!isdigit(ch)) { return false; } } int num = stoi(segment); if (num < 0 || num > 255) { return false; } ++count; } return count == 4; } bool is0or127segment(const string &ip) { istringstream iss(ip); string segment; getline(iss, segment, '.'); if (stoi(segment) == 0 || stoi(segment) == 127) { return true; } return false; } bool isValidSubnetMask(const string &mask) { istringstream iss(mask); string segment; unsigned result = 0; while (getline(iss, segment, '.')) { result = (result << 8) + stoi(segment); } if (result == 0 || result == 0xFFFFFFFF) { return false; } return (result | result-1) == 0xFFFFFFFF ? true : false; } bool isPrivateIPAddress(const string &ip) { istringstream iss(ip); string segment; vector<int> v; while (getline(iss, segment, '.')) { v.push_back(stoi(segment)); } if (v[0] == 10) { return true; } if (v[0] == 172 && (v[1] >= 16 && v[1] <= 31)) { return true; } if (v[0] == 192 && v[1] == 168) { return true; } return false; } int main() { string record; unsigned a=0, b=0, c=0, d=0, e=0, err=0, p=0; while (cin >> record) { istringstream iss(record); string split; vector<string> v; while (getline(iss, split, '~')) { v.push_back(split); } if (is0or127segment(v[0])) { continue; } if (!isValidIPAddress(v[1]) || !isValidSubnetMask(v[1])) { ++err; } else if (!isValidIPAddress(v[0])) { ++err; } else { if (isPrivateIPAddress(v[0])) { ++p; } int firseg = stoi(v[0].substr(0, v[0].find_first_of('.'))); if (firseg > 0 && firseg < 127) { ++a; } else if (firseg > 127 && firseg < 192) { ++b; } else if (firseg > 191 && firseg < 224) { ++c; } else if (firseg > 223 && firseg < 240) { ++d; } else if (firseg > 239 && firseg < 256) { ++e; } } } cout<< a << ' ' << b << ' ' << c << ' ' << d << ' ' << e << ' ' << err << ' ' << p << endl; return 0; }
我想问一下判断子网掩码有效与否为什么别人的答案有(b & b-1) == 0,为什么不是我的63行这样
(result | result-1) == 0xFFFFFFFF,我举个例子b=1100,b-1 =1011 ,第一个式子得到1000 不等于0,所以1100是无效掩码?
如果用我的判断,等于1111,所以是有效掩码,符合假设。所以用 &的能跑通这个题是为什么?
更新:原来他们的答案有取反~操作,是我看漏了,那应该对了