一个初始化bitmap小算法
- 根据长度,创建bitmap
- 初始化bitmap
根据长度,创建bitmap
看到一个开源项目,利用bitmap存储数据,其中创建和初始化过程,比较经典。这里摘录出来,以备后续使用。代码采用的是golang
//数据结构
type bitmap struct {a []uint64bitsLen int
}
// 入参是数据实际长度
func (bm *bitmap) init(bitsLen int) {a := bm.a//一个long是8字节(64bit), 通过长度bitlen计算出需要多少bit,向上取整//在网络编程中,经常是4字节、8字节对齐,其实是一样的道理wordsLen := (bitsLen + 63) / 64 a = slicesutil.SetLength(a, wordsLen)bm.a = abm.bitsLen = bitsLen
}
初始化bitmap
func (bm *bitmap) setBits() {a := bm.a// 把bit位全部设置为1,即设置成-1, 因为是无符号的,-1就是最大值for i := range a {a[i] = ^uint64(0)}// 这个地方,模除,实际上计算出多余的,不需要的bit位tailBits := bm.bitsLen % 64// 将多余不需要使用的bit位设置成0if tailBits > 0 && len(a) > 0 { //将末尾用不到的bitmap,设置成0// Zero bits outside bitsLen at the last worda[len(a)-1] &= (uint64(1) << tailBits) - 1}
}