多状态值存储

说明:

  • 适用于少于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<>=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

你可能感兴趣的:(多状态值存储)