popcnt_19.go 767 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. //go:build go1.9
  2. // +build go1.9
  3. package bitset
  4. import "math/bits"
  5. func popcntSlice(s []uint64) uint64 {
  6. var cnt int
  7. for _, x := range s {
  8. cnt += bits.OnesCount64(x)
  9. }
  10. return uint64(cnt)
  11. }
  12. func popcntMaskSlice(s, m []uint64) uint64 {
  13. var cnt int
  14. for i := range s {
  15. cnt += bits.OnesCount64(s[i] &^ m[i])
  16. }
  17. return uint64(cnt)
  18. }
  19. func popcntAndSlice(s, m []uint64) uint64 {
  20. var cnt int
  21. for i := range s {
  22. cnt += bits.OnesCount64(s[i] & m[i])
  23. }
  24. return uint64(cnt)
  25. }
  26. func popcntOrSlice(s, m []uint64) uint64 {
  27. var cnt int
  28. for i := range s {
  29. cnt += bits.OnesCount64(s[i] | m[i])
  30. }
  31. return uint64(cnt)
  32. }
  33. func popcntXorSlice(s, m []uint64) uint64 {
  34. var cnt int
  35. for i := range s {
  36. cnt += bits.OnesCount64(s[i] ^ m[i])
  37. }
  38. return uint64(cnt)
  39. }