// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 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() { for i := range a { var n byte for x := i; x != 0; x >>= 1 { if x&1 != 0 { n++ } } a[i] = n } } func popcountTable(x word) int { return int(a[byte(x>>(0*8))] + a[byte(x>>(1*8))] + a[byte(x>>(2*8))] + a[byte(x>>(3*8))] + a[byte(x>>(4*8))] + a[byte(x>>(5*8))] + a[byte(x>>(6*8))] + a[byte(x>>(7*8))]) } // nlz returns the number of leading zeros of x. // From Hacker's Delight, fig 5.11. func nlz(x word) int { x |= (x >> 1) x |= (x >> 2) x |= (x >> 4) x |= (x >> 8) x |= (x >> 16) x |= (x >> 32) return popcount(^x) } // ntz returns the number of trailing zeros of x. // From Hacker's Delight, fig 5.13. func ntz(x word) int { if x == 0 { return bitsPerWord } n := 1 if bitsPerWord == 64 { if (x & 0xffffffff) == 0 { n = n + 32 x = x >> 32 } } if (x & 0x0000ffff) == 0 { n = n + 16 x = x >> 16 } if (x & 0x000000ff) == 0 { n = n + 8 x = x >> 8 } if (x & 0x0000000f) == 0 { n = n + 4 x = x >> 4 } if (x & 0x00000003) == 0 { n = n + 2 x = x >> 2 } return n - int(x&1) }