题解 | #识别有效的IP地址和掩码并进行分类统计#c++,利用bitset进行求解。
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <iostream>
#include <bitset>
#include <string>
#include <vector>
using namespace std;
bool isIgnore(vector<string> ip) {
if (ip[0].compare("0") == 0 || ip[0].compare("127") == 0){
return true;
}
return false;
}
bool isIpValid(vector<string> ip) {
for(int i=0;i<int(ip.size());i++){
// 不包含数字的情况 19..0
if(ip[i].size() == 0){
return false;
}
//大于256 或 小于0
if(stoi(ip[i]) >= 256 || stoi(ip[i]) < 0){
return false;
}
}
return true;
}
bool isMaskValid(vector<string> mask){
string s;
for(int i=0;i<mask.size();i++){
s.append((bitset<8>(stoi(mask[i]))).to_string());
}
// mask的判断规则为:先取Not,再加一,再取and
bitset<32> bit1(s);
if(bit1.count() == 32 || bit1.count() == 0){
return false;
}
bitset<32> bit2((~bit1).to_ulong()+1);
if(((~bit1)&bit2).to_ulong() != 0){
return false;
}
return true;
}
int main(void) {
string ipAddress; //接受输入的ip地址字符串
string maskCode; //接受输入的子网掩码字符串
vector<string> ip; //ip地址数组(4),每个值都为bit形式
vector<string> mask; //mask地址数组(4),每个值都为bit形式
string input;
vector<int> result(7,0);
int start;
int count = 0;
// bitset<32> ip;
// bitset<32> code;
while (cin >> input) {
ip.clear();
mask.clear();
int index = input.rfind('~');
ipAddress = input.substr(0, index);
maskCode = input.substr(index + 1);
ipAddress.push_back('.');
maskCode.push_back('.');
//读取并保存ip
start = 0;
for (int i = 0; i < ipAddress.size(); i++) {
if (ipAddress[i] == '.') {
// bitset<8> bit(stoi(ipAddress.substr(start, i - start)));
ip.push_back(ipAddress.substr(start, i - start));
start = i + 1;
}
}
//读取并保存mask
start = 0;
for (int i = 0; i < maskCode.size(); i++) {
if (maskCode[i] == '.') {
// bitset<8> bit(stoi(ipAddress.substr(start, i - start)));
mask.push_back(maskCode.substr(start, i - start));
start = i + 1;
}
}
if(isIgnore(ip)){
continue;
}
if(!isMaskValid(mask) || !isIpValid(ip)){
result[5]++;
}
else{
if(stoi(ip[0])>=1 && stoi(ip[0])<=126){
result[0]++;
}
else if(stoi(ip[0])>=128 && stoi(ip[0])<=191){
result[1]++;
}
else if(stoi(ip[0])>=192 && stoi(ip[0])<=223){
result[2]++;
}
else if(stoi(ip[0])>=224 && stoi(ip[0])<=239){
result[3]++;
}
else if(stoi(ip[0])>=240 && stoi(ip[0])<=255){
result[4]++;
}
if(stoi(ip[0])==10){
result[6]++;
}
if(stoi(ip[0])==172 && stoi(ip[1])>=16 && stoi(ip[1])<=31){
result[6]++;
}
if(stoi(ip[0])==192 && stoi(ip[1])==168){
result[6]++;
}
}
}
for(int j=0;j<result.size();j++){
cout<< result[j]<<" ";
}
return 0;
}