「GoCN酷Go推荐」go语言位操作库 — bitset
bitset库
实现了bitsets
数据结构,这是一种正整数和布尔值映射关系的结构,它比map[uint]bool
更高效
什么是bitsets✦
bitsets基本思想是用一个bit位来标记某个元素对应的Value,每一位表示一个数,1表示存在,0表示不存在 比如我要表示1, 3, 7这3个数
构造一个空白bitsets:00000000
每位代表的值如下:76543210
想要表示的值标记1:10001010
有什么好处?✦
最大的好处是节省存储空间,假设有20亿个正整数中找出m是否在其中 如果每个数字用int存储,占8byte,2000000000 * 8 = 14G 如果用bit存储每个数字,占1bit,2000000000 / 8 = 0.233G 由此可见bitsets节省了极大的存储空间
Usage✦
安装
go get github.com/bits-and-blooms/bitset
基本操作
// 构造一个64bit长度的bitset
b := bitset.New(64)
// 放入一个数
b.Set(10)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000010000000000
// 删除一个值
b.Clear(10)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000000000000000
// 长度
b.Set(1).Set(3)
fmt.Println(b.Len()) // 64
// 测试
fmt.Println(b.Test(3)) // true
fmt.Println(b.Test(4)) // false
指定位置操作
b := &bitset.BitSet{}
b.Set(3)
// 在指定位置插入0
b.InsertAt(3)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000000000010000
// 在指定位置修改
b.SetTo(4, false)
fmt.Println(b.DumpAsBits()) // 000000000000000000000000000000000000000000000000000000000000
// 指定位置删除
b.Set(3).DeleteAt(3) // 000000000000000000000000000000000000000000000000000000000000
两个bitsets交互
a := &bitset.BitSet{}
a.Set(1).Set(3).Set(5)
b := &bitset.BitSet{}
b.Set(3).Set(5).Set(7)
// 交集
fmt.Println(a.Intersection(b)) // {3,5}
// 并集
fmt.Println(a.Union(b)) // {1,3,5,7}
// 差集
fmt.Println(a.Difference(b)) // {1}
// 全等
fmt.Println(a.Equal(b)) // false
遍历
b := bitset.New(64)
b.Set(1).Set(3).Set(5).Set(7)
for i, e := b.NextSet(0); e; i, e = b.NextSet(i + 1) {fmt.Println("The following bit is set:", i)
}
// The following bit is set: 1
// The following bit is set: 3
// The following bit is set: 5
// The following bit is set: 7
实例✦
假设现在数据库里有一个字段存储用户状态,设计是这样的:0 00 00 第1、2位表示会员等级 00表示普通会员,01表示vip1,10表示vip2,11表示svip 第3、4位表示头像状态 00表示未上传,01表示01审核中,10审核失败,11审核通过 第5位表示账号状状态 0表示正常,1表示封禁
b := bitset.New(5)
// 设置vip1,第1位0,第2位1
b.SetTo(1, false).SetTo(2, true)// 设置头像审核失败,第3位1,第4位0
b.SetTo(3, true).SetTo(4, false)// 状态初始化
b.ClearAll()// 查看账号状态,第5位,true代表1 false代表0
b.Test(5) // 是不是svip,第1、2位是11
b.Test(1) && b.Test(2)
总结✦
bitset/bitmap在日常开发中会经常用到,在特定场景下有很好的效果。这个库可以简化操作bitset/bitmap的难度,而且这个库的源码也很好的演示了go的位操作
官方文档:https://github.com/bits-and-blooms/bitset
《酷Go推荐》招募:
各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到
新的库,并且知道怎么用。
大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名
扫码也可以加入 GoCN 的大家族哟~
「GoCN酷Go推荐」go语言位操作库 — bitset相关推荐
- 「GoCN酷Go推荐」Go 语言高性能图像处理神器 h2non/bimg
0 推荐背景 日常业务开发中常会遇到各种图像处理需求,如,图片大小调整.翻转.旋转.提取大小.加水印.图片模糊化,格式转换,修剪等等:图像处理根据业务需求一部分图像处理需求在前端完成,如,用户裁剪编辑 ...
- 「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh...
PairMesh是什么? Pairmesh是一款先进的虚拟局域网(VPN)工具,用来搭建与访问安全,易用,高性能的点对点的软件定义虚拟局域网,为远程办公的网络连接问题提供了开箱即用的解决方案. 拥抱开 ...
- 「GoCN酷Go推荐」QQ机器人 go-cqhttp
什么是 go-cqhttp?✦ QQ机器人,可以做的事儿太多了,比如一个UP主需要群发多个QQ群,以便通知粉丝们开播:再比如可以检测群内或发给自己的消息,而通过代码直接回复做的简单回复.比如检测群内有 ...
- 「GoCN酷Go推荐」高性能内存缓存 ristretto
背景 ristretto 是 dgraph 团队开源的一款高性能内存缓存库,旨在解决高并发场景下的缓存性能和吞吐瓶颈.dgraph 专攻的方向是高性能图数据库,ristretto 就是其图数据库和 K ...
- 「GoCN酷Go推荐」快速搭建私有云服务 go-btfs
# 1. go-btfs 是什么?# go-btfs 是一个去中心化的文件存储平台,无论图片.文件.视频等等各类文件.每个人都可以在自己电脑上安装部署 BTFS 节点,然后大家的节点相互连接,构成一个 ...
- 「GoCN酷Go推荐」JSON 数据获取器 JID
01 推荐理由 JSON 格式数据适用范围非常广泛,一个内容丰富的json数据可能很大,使用 JID 可以让你非常舒服的获取到想要到数据. 02 简介 JID 是一个过滤JSON格式数据 cli ...
- 「GoCN酷Go推荐」Golang轻量级桌面程序wails2教学
01 推荐理由 不依赖cgo!不依赖cgo!不依赖cgo!真的不依赖cgo,且跨平台,原生渲染 无嵌入式浏览器,轻量级,生成的文件很小,而且只有一个可执行文件就可运行. 02 功能介绍 后端使用标准 ...
- 「GoCN酷Go推荐」简单易用的性能分析工具——nitro
#1 推荐理由 Golang官方在程序性能分析方面提供了用来分析cpu/内存等采样信息的pprof,以及用来追踪和分析运行时事件的trace,这两个工具对于分析程序的性能瓶颈可以说是得心应手.但是,对 ...
- 「GoCN酷Go推荐」漏桶限流库 — uber-go/ratelimit
上次有同学分享了 单机限流器 time/rate 库,讲了 Golang 标准库中基于令牌桶实现限流组件的 time/rate 使用,同时也讲了一些限流算法原理. 这里分享一个 uber 开源的一套基 ...
最新文章
- Luogu T24242 购物券Ⅰ(数据已加强)
- nginx websocket proxy
- SpringBoot 2.0静态资源映射
- 找出两个字符串数组中的相同元素
- Spring Integration –轮询文件的创建和修改
- 十、request.getSession( )、reqeust.getSession(false)和 request.getSession(true)
- 物联网项目(三)平台架构
- 财务分析真不难!无需代码,一个模板直接复用,碾压上千Excel表
- a html w3c,HTML a 标签 | w3cschool菜鸟教程
- 为什么说CCSK是云安全从业人员必备证书之一
- 百人计划(图形部分)Bump Mapping(凹凸贴图映射技术)
- 慧鱼机器人编程18子程序
- FAT,FAT32,NTFS
- 多传感器融合定位-章节索引
- 互联网思维之社会化思维
- 电脑热点和虚拟机网卡冲突
- Android端FMODSoundTouch音频变声解决方案
- org.apache.kafka.clients.consumer.CommitFailedException
- 怎么还原计算机系统还原,怎么还原以前版本的windows?Win7/Win10系统还原方法
- 2020-08-31
热门文章
- 无线测温模块在轧钢厂的应用
- “一路向南,dream it possible”之旅--骑行从北京到成都(一)
- GlusterFs安装部署文档
- 浏览器使用默认端口9006连接TinyWebServer服务器连接不上?
- 微信/微博的图片处理?-android酷炫图片处理(下)
- xmap 配置php环境,xmap 的动态 - SegmentFault 思否
- 深度学习经典网络解析图像分类篇(二):AlexNet
- 台达PLC与单片机的通讯
- C/C++超市收银系统
- Informatica保障江苏电信规范化ETL开发