题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
#include <bitset> #include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; bool is_mask(vector<int>& vec_mask){ unsigned int m=0; for(int i=0;i<vec_mask.size();i++){ m = m<<8; m += vec_mask[i]; } m = ~m+1; // 如果为掩码,其二进制为1的数量只能为1 bitset<32> b(m); if(b.count()==1) return true; return false; } bool is_ip(vector<int>& vec_ip){ for(int i=0;i<vec_ip.size();i++){ if(vec_ip[i]<0 || vec_ip[i]>255) return false; } return true; } int main() { // 输入 string mask; string ip1,ip2; getline(cin, mask); getline(cin, ip1); getline(cin, ip2); vector<int> vec_mask; vector<int> vec_ip1; vector<int> vec_ip2; string s; stringstream ss_m(mask); while(getline(ss_m, s, '.')) vec_mask.push_back(stoi(s)); stringstream ss_ip1(ip1); while(getline(ss_ip1, s, '.')) vec_ip1.push_back(stoi(s)); stringstream ss_ip2(ip2); while(getline(ss_ip2, s, '.')) vec_ip2.push_back(stoi(s)); // 不合法 if(vec_mask.size()!=4 || vec_ip1.size()!=4 || vec_ip2.size()!=4){ cout<<1; return 0; } //判断是否合法 if(!(is_mask(vec_mask) && is_ip(vec_ip1) && is_ip(vec_ip2))){ cout<<1; return 0; } unsigned int m=0; // 掩码 unsigned int p1=0; // ip1 unsigned int p2=0; // ip2 for(int i=0;i<vec_mask.size();i++){ m = m<<8; p1 = p1<<8; p2 = p2<<8; m += vec_mask[i]; p1 += vec_ip1[i]; p2 += vec_ip2[i]; } if((m&p1) == (m&p2)){ cout<<0; return 0; } cout<<2; return 0; } // 64 位输出请用 printf("%lld")