type IntSet struct {
words []uint
length int
}
func (s *IntSet) Has(x int) bool {
word, bit := x / (32 << (^uint(0) >> 63)), x % (32 << (^uint(0) >> 63)) // 确定平台的无符号类型是32位还是64位: (32 << (^uint(0) >> 63))
return word < len(s.words) && s.words[word] & (1 << bit) != 0
}
func (s *IntSet) Add(x int) {
word, bit := x / (32 << (^uint(0) >> 63)), x % (32 << (^uint(0) >> 63))
for word >= len(s.words) {
s.words = append(s.words,0)
}
s.words[word] |= 1 << bit
s.length++
}
func (s *IntSet) UnionWith(t *IntSet) {
for i, tWord := range t.words {
if i < len(s.words) {
s.length += getOneBitsCount(s.words[i] ^ (s.words[i] | tWord))
s.words[i] |= tWord
}else {
s.length += getOneBitsCount(tWord)
s.words = append(s.words, tWord)
}
}
}
func getOneBitsCount(x uint) int {
ans := 0
for x != 0 {
x &= x - 1
ans++
}
return ans
}
func (s IntSet) String() string {
var buf bytes.Buffer
buf.WriteByte('{')
for i, word := range s.words {
if word == 0 {
continue
}
for j := 0; j < (32 << (^uint(0) >> 63)); j++ {
if word&(1 << uint(j)) != 0 {
if buf.Len() > len("{"){
buf.WriteByte(' ')
}
_, _ = fmt.Fprintf(&buf,"%d",(32 << (^uint(0) >> 63)) * i + j)
}
}
}
buf.WriteByte('}')
return buf.String()
}
func (s *IntSet) Len() int {
return s.length
}
func (s *IntSet) Remove(x int) {
word, bit := x / (32 << (^uint(0) >> 63)), x % (32 << (^uint(0) >> 63))
s.words[word] &^= 1 << bit
s.length--
}
func (s *IntSet) Clear() {
s.words = s.words[:0]
s.length = 0
}
func (s *IntSet) Copy() *IntSet {
return &IntSet{
words: s.words,
length: s.length,
}
}
func main() {
var x, y IntSet
x.Add(1)
x.Add(2)
x.Add(3)
x.Add(9)
x.Add(144)
x.Add(1 << 2 )
for i := 100; i < 9999; i++ {
x.Add(i)
}
//fmt.Println(x.String())
y.Add(42)
y.Add(1)
y.Add(2)
y.Add(9)
//fmt.Println(y.String())
x.UnionWith(&y)
fmt.Println(x)
fmt.Println(x.Has(10 - 1))
fmt.Println(x.Len())
x.Remove(1)
fmt.Println(x)
for i := 100; i < 9999; i++ {
x.Remove(i)
}
fmt.Println(x)
fmt.Println(x)
x1 := x.Copy()
x.Clear()
fmt.Println(x)
fmt.Println(x1)
}
核心思想:用1bit代表一个数字