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 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。