Bitmap

88 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

Bitmap

在计算机科学中,Bitmap是一种数据结构,用于表示一个集合,其中每个元素被映射到一个位或一个数组的单元,而该单元可以设置或清除,以表示元素是否属于该集合。

Bitmap的应用范围非常广泛,例如在搜索引擎的索引和查询处理中,用于快速定位和匹配关键字;在数据库中,用于索引和快速查找数据;在网络协议中,用于网络流量监控和过滤;在算法和计算机科学中,用于快速排序、排重和计算问题等。

在Bitmap数据结构中,每个元素通常表示一个非负整数,该整数可以作为索引,映射到一个位或数组单元上。如果该元素属于该集合,则该位被设置为1,否则被清除为0。这种表示方法允许快速判断某个元素是否在集合中,只需检查对应的位或数组单元即可。

Bitmap数据结构在空间利用方面非常高效,因为每个元素只需要占用一个位或数组单元,因此对于大型数据集合,可以显著减少存储空间的使用。同时,由于位操作和数组操作是计算机中最基本和最快的操作之一,因此Bitmap数据结构在性能方面也具有很高的优势。

代码实现

type Bitmap struct {
   bits []byte
   size int
}

func NewBitmap(size int) *Bitmap {
   n := (size + 7) / 8
   return &Bitmap{make([]byte, n), size}
}

func (b *Bitmap) SetBit(i int) {
   if i < 0 || i >= b.size {
      return
   }
   index := i / 8
   bit := uint(i % 8)
   b.bits[index] |= 1 << bit
}

func (b *Bitmap) ClearBit(i int) {
   if i < 0 || i >= b.size {
      return
   }
   index := i / 8
   bit := uint(i % 8)
   b.bits[index] &= ^(1 << bit)
}

func (b *Bitmap) GetBit(i int) bool {
   if i < 0 || i >= b.size {
      return false
   }
   index := i / 8
   bit := uint(i % 8)
   return b.bits[index]&(1<<bit) != 0
}

func main() {
   bitmap := NewBitmap(16)
   bitmap.SetBit(0)
   bitmap.SetBit(1)
   bitmap.SetBit(3)
   bitmap.ClearBit(1)

   for i := 0; i < 16; i++ {
      fmt.Printf("%v \n", bitmap.GetBit(i))
   }
}

1个byte(字节)等于8个bit(比特),因此对于长度为n的bitmap,使用n/8长度的byte数组即可存储。

  • SetBit:将某一位置1
  • ClearBit:将某一位置0
  • GetBit:判断某一位是否为1