每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。
分类: LINUX
2013-02-20 21:44:39
11111111 11111111 11111111 00000000
#include在转换函数1中, 使用的是最直接的方法, 通过对0x1左移位, 求出一共有多少个1, 从而得出子网掩码号.#include #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; }