这里给原文的 add 和 Has方法加上了自己的理解注释
package intset
type IntSet struct{
words []uint64//无符号 8byte
}
//Bit数组中一个成员可以存储64位,代表64个不同的数
//将某一位置1即 代表将其加入数组中
// x/64获取的是元素在bit数组中的第几个成员,比如x=116 x/64=1 即元素可能在Bit[1]中
// x%64获取元素具体的位置x=116 x%64=52 则其应在Bit[1]的第52位上
//判断是否包含非负值x
func (s *IntSet) Has(x int) bool{
word,bit:=x/64,uint8(x%64)
return word<len(s.words)&&s.words[word]&(1<<bit)!=0
//判断是否包含指定的x是通过判断x是否在集合包含的范围内(word<len(s.words)),集合的成员内指定的位 是否为1, ...(1<<bit)是个啥
}
//将x加入Bit数组中
func (s *IntSet) Add(x int){
word,bit :=x/64,uint(x%64)
for word >=len(s.words){
s.words=append(s.words,0)
}
//使用for循环是为了扩展Bit数组的成员,比如原始有两个成员Bit[0] Bit[1]
//如果要加入元素155(大于128)原始的集合无法表示(只有128位),需要再添加一个成员,并且初始化为0
s.words[word]|=1<<bit
//增加元素时,一位代表一个元素,如果要添加155 则将Bit[2]中的第27位 置为1 ,也就是s.words[word]|=1<<bit
//之所以使用|=是因为集合的成员已经存储了其他值,直接让其等于会清空其他的值,使用或等于,其他置为1的标志位不会改变
}
func (s *IntSet) UnionWith(t *IntSet){
for i,tword :=range t.words{
if i<len(s.words){
s.words[i]
}
}
}