Go言語(golang) ビットフラグ/マスク
golang でビット演算を使ったフラグ(マスク)
ビットフラグは、1 か 0 (真か偽) で 1ビットずつに意味を持たせたものです。
例えば 000 と三桁あって
A のフラグをオンにすると 001、
B のフラグをオンにすると 010、
C のフラグをオンにすると 100、
全てフラグをオンにすると 111、 となります。
このように、各ビットの オン/オフ を切り替えて比較して使います。
ビット演算については別の記事に書いてます。
&
:比較する。ビット積(AND)は、どちらも 1 (真) だった場合に 1 になる|
:オンにする。ビット和(OR)は、どちらか一方が 1 (真)の場合、1 になる^
:オフにする。ビット否定(NOT) どちらか一方だけが 1 (真)の場合に、1 になる
package main import "fmt" const ( // iota を使ってひと桁ずつシフトする A uint = 1 << iota // 001 B // 010 C // 100 // すべてオン E = A | B | C // 111 ) func main() { var bits uint // A フラグをオンにする bits |= A fmt.Printf("bits: %03b, A: %t\n", bits, bits&A == A) // bits: 001, A: true // B フラグをオンにする bits |= B fmt.Printf("bits: %03b, B: %t\n", bits, bits&B == B) // bits: 011, B: true // C フラグをオンにする bits |= C fmt.Printf("bits: %03b, C: %t\n", bits, bits&C == C) // bits: 111, C: true // B フラグをオフ(反転)にする bits ^= B fmt.Printf("bits: %03b, B: %t\n", bits, bits&B == B) // bits: 101, B: false // リセット bits = 0 fmt.Printf("bits: %03b, Reset!\n", bits) // bits: 000 // E(すべての) フラグをオンにする bits |= E fmt.Printf("bits: %03b, E: %t\n", bits, bits&E == E) // bits: 111, E: true fmt.Printf("A: %t, B: %t, C: %t\n", bits&A == A, bits&B == B) // A: true, B: true, C: true }