dpq755012465 2019-01-23 00:57
浏览 146
已采纳

在Go中使用位掩码(使用iota进行枚举)

Bit stuck.

I'm trying to work out how to get the bitmask values from a const with go enumeration. For example, if key is 5, which is 0101 bits, it would be dog and fish. What is the easiest way to get the bit values (1,2,4,8,16, 32, 64 etc) so I can select the string values and return the set of animals?

type Key int

const (
    Dog Key = 1 << iota
    Cat
    Fish
    Horse
    Snake
    Rabbit
    Lion
    Rino
    Hedgehog
)

Been reading but I can't work this out.

  • 写回答

1条回答 默认 最新

  • douchao9899 2019-01-23 01:29
    关注

    Declare a slice of strings where the strings correspond to the constant names:

    var animalNames = []string{
        "Dog",
        "Cat",
        "Fish",
        "Horse",
        "Snake",
        "Rabbit",
        "Lion",
        "Rino",
        "Hedgehog",
    }
    

    To get the names for the bits, loop through the names. If the corresponding bit is set, add the name to the result:

    func Names(k Key) []string {
        var result []string
        for i := 0; i < len(animalNames); i++ {
            if k&(1<<uint(i)) != 0 {
                result = append(result, animalNames[i])
            }
        }
        return result
    }
    

    Run it on the playground.

    If you change the the constants to be bit indexes instead of bit values, then you can use the stringer utility to create a func (k Key) String() string. Here's the code for this change:

    type Key uint
    
    const (
        Dog Key = iota
        Cat
        Fish
        Horse
        Snake
        Rabbit
        Lion
        Rino
        Hedgehog
    )
    
    //go:generate stringer -type=Key
    
    func Names(k Key) []string {
        var result []string
        for animal := Dog; animal <= Hedgehog; animal++ {
            if k&(1<<animal) != 0 {
                result = append(result, animal.String())
            }
        }
        return result
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    报告相同问题?

    悬赏问题

    • ¥15 我不明白为什么c#微软的官方api浏览器为什么不支持函数说明的检索,有支持检索函数说明的工具吗?
    • ¥15 ORBSLAM2框架跑ICL-NUIM数据集
    • ¥15 在我想检测ros是否成功安装时输入roscore出现以下
    • ¥30 老板让我做一个公司的投屏,实时显示日期,时间,安全生产的持续天数,完全没头绪啊
    • ¥15 Google Chrome 所有页面崩溃,三种解决方案都没有解决,我崩溃了
    • ¥20 使用uni-app发起网络请求,获取重定向302返回的cookie
    • ¥20 手机外部浏览器拉起微信小程序支付 (相关搜索:微信小程序)
    • ¥20 怎样通过一个网址找到其他同样模版的网址
    • ¥30 XIAO esp32c3 读取FDC2214的数据
    • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信