一个初始化bitmap的小算法
一个初始化bitmap小算法
- 根据长度,创建bitmap
- 初始化bitmap
根据长度,创建bitmap
看到一个开源项目,利用bitmap存储数据,其中创建和初始化过程,比较经典。这里摘录出来,以备后续使用。代码采用的是golang
//数据结构
type bitmap struct {
a []uint64
bitsLen 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 = a
bm.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位设置成0
if tailBits > 0 && len(a) > 0 { //将末尾用不到的bitmap,设置成0
// Zero bits outside bitsLen at the last word
a[len(a)-1] &= (uint64(1) << tailBits) - 1
}
}