Home > Software engineering >  short way of ORing all flags
short way of ORing all flags

Time:09-27

With the following:

const (
    Flag1 = 0
    Flag2 = uint64(1) << iota
    Flag3      
    Flag4      
    Flag5      
)

is there a shorter/better way of doing, I want to OR them all:

const FlagAll = Flag1 | Flag2 | Flag3 | Flag4 | Flag5

CodePudding user response:

Since all your flags contain a single 1 bit, shifting the bit to the left, FlagAll would be the next in the line but subtract 1:

const (
    Flag1 = 0
    Flag2 = uint64(1) << iota
    Flag3
    Flag4
    Flag5
    FlagAll = uint64(1)<<iota - 1
)

Testing it:

fmt.Printf("b\n", Flag1)
fmt.Printf("b\n", Flag2)
fmt.Printf("b\n", Flag3)
fmt.Printf("b\n", Flag4)
fmt.Printf("b\n", Flag5)
fmt.Printf("b\n", FlagAll)

This will output (try it on the Go Playground):

00000000
00000010
00000100
00001000
00010000
00011111

Note that you get the same value if you left shift the last constant and subtract 1:

const FlagAll2 = Flag5<<1 - 1

But this requires to explicitly include the last constant (Flag5) while the first solution does not require it (you may add further flags like Flag6, Flag7..., and FlagAll will be right value without changing it).

  • Related