#include #if 0
static int ntod(u_int32_t mask) { //转换函数1
int i, n = 0;
int bits = sizeof(u_int32_t) * 8;
for(i = bits - 1; i >= 0; i--) {
if (mask & (0x01 << i))
n++;
}
return n;
}
#else
static int ntod(u_int32_t mask) { //转换函数2
float f;
mask = -mask; //第一步
f = mask; //第二步
mask = *(unsigned *)&f; //第三步
mask = 159 - (mask >> 23); //第四步
return mask;
}
#endif
static u_int32_t dton(u_int32_t mask) { //转换函数3
u_int32_t i, c;
int bits = sizeof(u_int32_t) * 8;
i = ~0;
bits -= mask;
/* 让32位全是1的无符号数与左移bits位(右移位用0填充)得出子网掩码 */
i <<= bits;
return htonl(i);
}
int main(void) {
char input[32];
struct in_addr addr;
scanf("%s", input);
if (inet_aton(input, &addr) == 0) {
printf("netmask is wrong\n");
exit(1);
}
addr.s_addr = htonl(addr.s_addr);
printf("%d\n", ntod(addr.s_addr));
return 0;
}