diff --git a/container/intsets/util.go b/container/intsets/util.go index 6710278170..dd1db86b1c 100644 --- a/container/intsets/util.go +++ b/container/intsets/util.go @@ -4,6 +4,16 @@ package intsets +// From Hacker's Delight, fig 5.2. +func popcountHD(x uint32) int { + x -= (x >> 1) & 0x55555555 + x = (x & 0x33333333) + ((x >> 2) & 0x33333333) + x = (x + (x >> 4)) & 0x0f0f0f0f + x = x + (x >> 8) + x = x + (x >> 16) + return int(x & 0x0000003f) +} + var a [1 << 8]byte func init() {