IP地址计算:
#include <stdio.h>
#include <stdlib.h>
// bits
int count1(int v) {
int n=0;
while (v) {
n+=v&0x01;
v>>=1;
}
return n;
}
// power
int power(int x,int y) {
if (y==0)
return 1;
else
return x*power(x,y-1);
}
int main(void) {
unsigned char ip[4],mask[4];
int t1,t2,t3,t4;
int t11,t12,t13,t14;
int c,i;
printf("\ninput ip address: ");
scanf("%d.%d.%d.%d",&t4,&t3,&t2,&t1);
ip[3]=t4;
ip[2]=t3;
ip[1]=t2;
ip[0]=t1;
printf("\ninput net mask: ");
scanf("%d.%d.%d.%d",&t14,&t13,&t12,&t11);
mask[3]=t14;
mask[2]=t13;
mask[1]=t12;
mask[0]=t11;
printf("\n");
c=count1(t11);
i=power(2,c)-2;
// printf("network bits is %d.\n",c);
// printf("network bits = 2 ^ %d = %d\n\n",c,i);
printf("subnet bits = %d\n",c);
printf("available max subnet = 2^%d-2 = %d\n\n",c,i);
printf("host bits = %d\n",8-c);
printf("available max hosts per subnet = 2^%d-2 = %d\n",8-c,power(2,8-c)-2);
printf("\nnet address is: %d.%d.%d.%d\n",ip[3]&mask[3],ip[2]&mask[2],ip[1]&mask[1],ip[0]&mask[0]);
printf("\nnet broadcast is : %d.%d.%d.%d\n",ip[3]|(unsigned char)~mask[3],ip[2]|(unsigned char)~mask[2],ip[1]|(unsigned char)~mask[1],ip[0]|(unsigned char)~mask[0]);
printf("\nip addr ranges is: %d.%d.%d.%d -- ",ip[3]&mask[3],ip[2]&mask[2],ip[1]&mask[1],(ip[0]&mask[0])+1);
printf("%d.%d.%d.%d\n\n",ip[3]|(unsigned char)~mask[3],ip[2]|(unsigned char)~mask[2],ip[1]|(unsigned char)~mask[1],ip[0]|(unsigned char)~mask[0]-1);
exit(0);
}