题解与讨论区 1221: IP地址

题解与讨论区 1221: IP地址

[命题人 : ]
时间限制 : 1.000 sec  内存限制 : 128 MB

返回问题页面

题目描述



Miaoyao正在学习计算机网络。


众所周知,在计算机网络中会使用IP地址标识设备在网络中的位置。IPv4协议中,IP地址为一个32位的二进制数,通常使用点分十进制的形式描述,即每8个二进制位为一节,不同节之间使用"."分开,每一节转化为十进制表示。

一个子网包含一段连续的IP地址范围。具体来说,每个子网可以用网络段位数\(k\)与网络地址表示。如果网络段位数为\(k\),那么网络地址除前\(k\)位以外均为0。只要是前\(k\)位与网络地址相同的IP地址均属于这个子网。例如,家用路由器通常会使用192.168.0.0/24这个子网,即网络地址为192.168.0.0,并使用前24位来确定子网。那么,192.168.0.0至192.168.0.255都属于这一子网,而192.168.1.0就不属于这一子网。


现在给出\(n\)个IP地址与一个子网,Miaoyao 想要知道有多少个IP地址属于这个子网。



第1221题的题解

重型榴弹手

爷就是菜! 的题解


模拟+位运算

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. int n;
  5. cin >>n;
  6. int i1, i2, i3, i4 ,k;
  7. scanf("%d.%d.%d.%d/%d", &i1, &i2, &i3, &i4, &k);
  8. getchar();
  9. unsigned int zi = 0;
  10. zi += i1;
  11. zi = zi << 8;
  12. zi += i2;
  13. zi = zi << 8;
  14. zi += i3;
  15. zi = zi << 8;
  16. zi += i4;
  17. k = 32 - k;
  18. zi = zi >> k;
  19. int res = 0;
  20. while(n --){
  21. int j1, j2, j3, j4;
  22. unsigned int wa = 0;
  23. scanf("%d.%d.%d.%d", &j1, &j2, &j3, &j4);
  24. getchar();
  25. // cout << j1 << j2 << j3 << j4 << endl;
  26. wa+=j1;
  27. wa = wa << 8;
  28. wa+=j2;
  29. wa = wa << 8;
  30. wa+=j3;
  31. wa = wa << 8;
  32. wa+=j4;
  33. wa = wa >> k;
  34. if(wa == zi) res ++;
  35. }
  36. cout << res << endl;
  37. return 0;
  38. }



点赞 3
举报