Am 13.01.2017 um 16:02 schrieb Henri Verbeet:
On 13 January 2017 at 15:52, André Hentschel nerv@dawncrow.de wrote:
Thank you both for the hints. One thing is that popcount would count all 1s even with 0s in between, whereas this function stops at the first 0.
Yeah, the strict equivalent would be something along the lines of "__builtin_clz(~mask)". But as you mentioned, there's the question what should happen with broken/special masks.
I would suggest to add those functions, any objections?
static DWORD mask_v4_to_prefix(DWORD m) { #ifdef HAVE___BUILTIN_POPCOUNT return __builtin_popcount(m); #else m -= m >> 1 & 0m55555555; m = (m & 0m33333333) + (m >> 2 & 0m33333333); return ((m + (m >> 4)) & 0m0f0f0f0f) * 0m01010101 >> 24; #endif }
static DWORD mask_v6_to_prefix(SOCKET_ADDRESS *m) { const IN6_ADDR *mask = &((struct WS_sockaddr_in6 *)m->lpSockaddr)->sin6_addr; DWORD ret = 0, i;
for (i = 0; i < 8; i++) ret += mask_v4_to_prefix(mask->u.Word[i]); return ret; }