diff options
Diffstat (limited to 'host.c')
-rw-r--r-- | host.c | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -10,8 +10,7 @@ struct in_net { struct in_addr addr; struct in_addr mask; }; -/* not needed begin */ -#define POPCNT(y) int popcnt##x (uint##y##_t x) { \ +#define POPCNT(y) int popcnt##y (uint##y##_t x) { \ int c = 0; \ for (int i = 0; i < y; i++) \ if (1 << i & x) \ @@ -19,8 +18,6 @@ struct in_net { return c; \ } POPCNT(32) -unsigned int power2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648 }; /* ah yes, libmath */ -/* not needed end */ struct in_net host (struct in_net n, unsigned long long int h /* number of host in the network */) { n.addr.s_addr = ntohl(n.addr.s_addr & n.mask.s_addr); n.mask.s_addr = ntohl(n.mask.s_addr); @@ -94,3 +91,15 @@ r: *--m = o; return r; } +unsigned long long int ri (unsigned long long int v, int s) { /* 000 100 010 110 001 101 011 111 */ + int i = s-1; + if (!(v & 1 << (s-1))) + return v | 1 << (s-1); + while (1) { + if (!(v & 1 << i)) + return v | 1 << i; + if (!i) /* rollover */ + return 0; + v &= ~(1 << i--); + } +} |