Go语言圣经学习笔记 实现Bit数组

这里给原文的 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]
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值