Go 位图

什么是位图

位图(Bitmap)是一种用来表示一组元素在某种情况下存在或不存在的数据结构。它通常用一个位数组来表示,其中每个位(二进制位)表示一个元素的存在与否。

在位图中,每个元素都与位数组的某个位置(索引)相关联。如果该元素存在,则对应的位被设置为1;如果该元素不存在,则对应的位被设置为0。这种表示方式非常紧凑且高效。

位图主要用于处理大量元素的存在与否,特别是针对不重复的元素集合。它在计算机科学和工程领域中有广泛的应用,包括但不限于以下方面:

  1. 布隆过滤器(Bloom Filter):用于快速判断一个元素是否可能存在在一个大型集合中。
  2. 数据压缩和压缩算法:用于存储和处理大规模的二进制数据。
  3. 数据库和索引结构:用于加速对数据的查询和过滤。
  4. 缓存和缓存管理:用于跟踪已加载或缓存的数据。
  5. 图像处理和图像编码:用于表示图像像素的存在状态。
  6. 数据结构和算法:用于位运算和计数操作等。

需要注意的是,位图适用于每个元素的唯一性,因为每个位只能表示一个元素的存在与否。如果位图中的元素具有重复性,需要使用其他数据结构来处理。

总的来说,位图是一种高效的数据结构,用于快速判断元素的存在与否,特别适用于处理大规模的、不重复的元素集合。

代码展示

package main

import "fmt"

/**
 * @Author XueZhimin
 * @Description
 * @Date 2023/7/16 09:04
 * @Version 1.0
 */

const (
	BitsPerByte = 8
)

// 定义位图结构
type Bitmap struct {
	data []byte // 存储位图数据的字节切片
	size uint   // 位图的大小
}

// 创建指定大小的位图
func NewBitmap(size uint) *Bitmap {
	// 计算所需的字节数
	bytesNeeded := (size + BitsPerByte - 1) / BitsPerByte
	return &Bitmap{
		data: make([]byte, bytesNeeded),
		size: size,
	}
}

// 设置指定位置的位为1
func (b *Bitmap) SetBit(pos uint) {
	// 计算位所在的字节位置
	bytePos := pos / BitsPerByte
	bitPos := pos % BitsPerByte

	// 使用位运算操作将对应位置的位设置为1
	b.data[bytePos] |= 1 << bitPos
}

// 判断指定位置的位是否为1
func (b *Bitmap) IsBitSet(pos uint) bool {
	// 计算位所在的字节位置
	bytePos := pos / BitsPerByte
	bitPos := pos % BitsPerByte

	// 使用位运算判断位是否为1
	return (b.data[bytePos] & (1 << bitPos)) != 0
}

// 输出位图内容
func (b *Bitmap) Print() {
	for i := uint(0); i < b.size; i++ {
		if b.IsBitSet(i) {
			fmt.Print("1")
		} else {
			fmt.Print("0")
		}

		// 每8位输出一个空格分隔
		if (i+1)%BitsPerByte == 0 {
			fmt.Print(" ")
		}
	}
	fmt.Println()
}

func main() {
	size := uint(16)
	bitmap := NewBitmap(size)

	bitmap.SetBit(0)
	bitmap.SetBit(2)
	bitmap.SetBit(8)
	bitmap.SetBit(10)
	bitmap.Print()

	fmt.Println("是否存在:", bitmap.IsBitSet(4))
	fmt.Println("是否存在:", bitmap.IsBitSet(8))
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻找优秀的自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值