问题描述:
现给定两个IPv4地址,和一个子网掩码,判断是否属于同一个子网,若属于,输出1,否则输出0。
例如输入:
172.16.1.3
172.16.1.35
255.255.255.224
输出:
0
解决方案:
首先将字符串格式的IP地址转化为4字节的IP地址,然后使用与(&)运算,分别将两个IP地址与掩码相与,若最后的值相同,则为同一个子网,否则不是。
以下函数的作用是将字符串格式的IP转化为4字节的IP(因为是4字节,所以使用int,但不同平台的int所占的字节好像不同哈~不太确定)
int _to_int(char * str, int start_idx, int end_idx)
{
int a = 0, i;
for (i = start_idx; i <= end_idx; ++i)
{
a = a * 10 + (str[i] - '0');
}
return a;
}
/*
* 将ip字符串转化为4字节的整形
*/
int ip_to_int(char * ip)
{
int start = 0, i = 0, ret = 0;
int shift_factor = 3; // 一开始要向右移动3 * 8位
char c;
while (c = ip[i])
{
if (c == '.')
{
int a = _to_int(ip, start, i - 1);
int temp = shift_factor * 8;
ret = ret | (a << temp);
shift_factor--;
start = i + 1;
}
i++;
}
return ret;
}
_to_int()函数的作用是将一段字符串转化为数字,实际上就是将点分隔的字符串转化为数字,ip_to_int()函数将字符串格式的ip转化为整形。
以下是ip地址与子网掩码运算的部分:
#include <stdio.h>
int main()
{
char a1[15], a2[15], a3[15];
gets(a1);
gets(a2);
gets(a3);
int ip1 = ip_to_int(a1);
int ip2 = ip_to_int(a2);
int ip3 = ip_to_int(a3);
int result = 0;
if ((ip1 & ip3) == (ip2 & ip3))
{
result = 1;
}
printf("%d", result);
return 0;
}
下面是其它网友的补充
题目描述
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
示例:
I P 地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
I P 地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000










