golangの日記

Go言語を中心にプログラミングについてのブログ

Go言語(golang) ビットフラグ/マスク

golang.png


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
}