mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 13:50:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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)
 | |
| }
 |