多状态值存储

说明:

  • 适用于少于32个状态值枚举值的多状态值存储
  • 状态值设定为2的指数次值,如[1,2,4,8,16,32,64....]
代码:
type MySys uint32

func (m *MySys) Add(num uint32) {
    m.checkNUm(num)
    *m |= MySys(num)
}

func (m *MySys) Sub(num uint32) {
    m.checkNUm(num)
    tmp := *m
    if tmp|MySys(num) == tmp {
        *m ^= MySys(num)
    }
}

func (m *MySys) List() (list []uint32){
    tmp , pow := *m , 0
    for tmp > 0{
        if tmp&1 == 1{
            list = append(list,1<<pow)
        }
        tmp>>=1
        pow++
    }
    return
}

func (m *MySys) checkNUm(num uint32) {
    if bits.OnesCount32(num) > 1 {
        panic("Only Support One Byte")
    }
}
使用示例:
func main(){
    var sys models.MySys
    sys.Add(1)
    sys.Add(2)
    sys.Add(4)
    sys.Add(8)
    fmt.Println("设置后的状态值为:",sys)
    sys.Sub(8)
    sys.Sub(1)
    fmt.Println("删除后的状态值为:",sys)
    fmt.Println("状态值列表为:",sys.List())
}

代码截图:

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,187评论 6 13
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,345评论 4 56
  • 本文会先介绍 Qt 自带的串口模块,然后引出在 PyQt5 中使用这些模块的方法。为了演示类和函数的具体使用方法,...
    import_hello阅读 13,398评论 1 4
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,994评论 2 59
  • Java 基础 语言特性 优点 ① 平台无关,摆脱硬件束缚,"一次编写,到处运行"。 ② 安全的内存管理和访问机制...
    续袁阅读 573评论 0 1