题解 | #判断两个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")
基恩士成长空间 442人发布