Merge pull request #89530 from tklauser/use-bits-onescount
Use OnesCount8 from math/bits to implement countBits
This commit is contained in:
		@@ -16,49 +16,16 @@ limitations under the License.
 | 
			
		||||
 | 
			
		||||
package allocator
 | 
			
		||||
 | 
			
		||||
import "math/big"
 | 
			
		||||
import (
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"math/bits"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// countBits returns the number of set bits in n
 | 
			
		||||
func countBits(n *big.Int) int {
 | 
			
		||||
	var count int = 0
 | 
			
		||||
	for _, b := range n.Bytes() {
 | 
			
		||||
		count += int(bitCounts[b])
 | 
			
		||||
		count += bits.OnesCount8(uint8(b))
 | 
			
		||||
	}
 | 
			
		||||
	return count
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// bitCounts is all of the bits counted for each number between 0-255
 | 
			
		||||
var bitCounts = []int8{
 | 
			
		||||
	0, 1, 1, 2, 1, 2, 2, 3,
 | 
			
		||||
	1, 2, 2, 3, 2, 3, 3, 4,
 | 
			
		||||
	1, 2, 2, 3, 2, 3, 3, 4,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	1, 2, 2, 3, 2, 3, 3, 4,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	1, 2, 2, 3, 2, 3, 3, 4,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	4, 5, 5, 6, 5, 6, 6, 7,
 | 
			
		||||
	1, 2, 2, 3, 2, 3, 3, 4,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	4, 5, 5, 6, 5, 6, 6, 7,
 | 
			
		||||
	2, 3, 3, 4, 3, 4, 4, 5,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	4, 5, 5, 6, 5, 6, 6, 7,
 | 
			
		||||
	3, 4, 4, 5, 4, 5, 5, 6,
 | 
			
		||||
	4, 5, 5, 6, 5, 6, 6, 7,
 | 
			
		||||
	4, 5, 5, 6, 5, 6, 6, 7,
 | 
			
		||||
	5, 6, 6, 7, 6, 7, 7, 8,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,20 +21,6 @@ import (
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestBitCount(t *testing.T) {
 | 
			
		||||
	for i, c := range bitCounts {
 | 
			
		||||
		actual := 0
 | 
			
		||||
		for j := 0; j < 8; j++ {
 | 
			
		||||
			if ((1 << uint(j)) & i) != 0 {
 | 
			
		||||
				actual++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if actual != int(c) {
 | 
			
		||||
			t.Errorf("%d should have %d bits but recorded as %d", i, actual, c)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCountBits(t *testing.T) {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		n        *big.Int
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user