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 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号