いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-101 (ビット操作メモ, ビット演算子)

概要

Goでのビット操作の基本的な部分をメモメモ。

こういうのって、大体使うときにど忘れしていることが多いので。。。

サンプル

package bitop

import (
    "github.com/devlights/gomy/output"
)

// Basic -- 基本的なビット操作のサンプルです.
//
// REFERENCES:
//   - 書籍「プログラミング言語 Go」--  P.60
//   - https://yourbasic.org/golang/bitwise-operator-cheat-sheet/
func Basic() error {
    // -----------------------------------------------------
    // ビット演算は集合演算と思うと理解しやすい.
    //
    // &  -- AND    , 共通部分
    // |  -- OR     , 和
    // ^  -- XOR    , 対称差 (どちらか一方しか持っていないもの)
    // &^ -- AND NOT, 差 (自分しか持っていないもの)、ビットクリア
    // -----------------------------------------------------

    var (
        x uint8 = 1<<0 | 1<<1 | 1<<5 // 00100011
        y uint8 = 1<<1 | 1<<3        // 00001010
    )

    // フォーマットのverbに %b を指定すると2進数表記となる
    // さらに 08 を付与して、8桁表示でゼロ埋めするように指示
    //
    // 補足) %#08b とすると, 先頭に 0b を付与して出力してくれる
    output.Stdoutf("[x]", "%08b\n", x)
    output.Stdoutf("[y]", "%08b\n", y)

    output.StdoutHr()

    // & は共通部分を取り出す。両方 1 のものが残る
    output.Stdoutf("[x&y ][共通部分]", "%08b\n", x&y)

    // | は和を取り出す。どちらか 1 のものが残る
    output.Stdoutf("[x|y ][和   ]", "%08b\n", x|y)

    // ^ は対称差を取り出す。どちらか片方しか 1 のものが残る.
    output.Stdoutf("[x^y ][対称差 ]", "%08b\n", x^y)

    // &^ は差を取り出す。 &^ はビットクリアともいう.
    // x&^yは、xの個々のビットは対応するyのビットが1の場合に0となる。
    // それ以外は、対応するxのビットがそのまま残る.
    //
    // 例) logパッケージの、デフォルトのフラグ設定をクリアする際に
    //        log.SetFlags(log.Flags &^ log.LstdFlags)
    //     としてビットクリアすると、一発でクリアできる
    //     (デフォルトで設定されているフラグ LstdFlags なので)
    output.Stdoutf("[x&^y][差   ]", "%08b\n", x&^y)

    output.StdoutHr()

    // 特定のビットが立っているか検査
    if x&(1<<5) != 0 {
        output.Stdoutl("[x&(1<<5)]", "ON")
    }

    output.StdoutHr()

    // 特定のビットを落とす
    x &^= (1 << 5)
    output.Stdoutf("[x &^= (1 << 5)]", "%08b\n", x)

    // 特定のビットを立てる
    x |= (1 << 5)
    output.Stdoutf("[x |= (1 << 5)]", "%08b\n", x)

    output.StdoutHr()

    // 特定のビットをトグル
    x ^= (1 << 7)
    output.Stdoutf("[x ^= (1 << 7)]", "%08b\n", x)
    x ^= (1 << 7)
    output.Stdoutf("[x ^= (1 << 7)]", "%08b\n", x)

    output.StdoutHr()

    // 自分の全ビットを反転
    output.Stdoutf("[^x]", "%08b\n", ^x)

    return nil
}

try-golang/bitop_basic.go at master · devlights/try-golang · GitHub

実行すると以下のようになります。

$ make run
ENTER EXAMPLE NAME: bitop
[Name] "bitop_basic"
[x]                  00100011
[y]                  00001010
-------------------------------------------------- 
[x&y ][共通部分]         00000010
[x|y ][和   ]         00101011
[x^y ][対称差 ]         00101001
[x&^y][差   ]         00100001
-------------------------------------------------- 
[x&(1<<5)]           ON
-------------------------------------------------- 
[x &^= (1 << 5)]     00000011
[x |= (1 << 5)]      00100011
-------------------------------------------------- 
[x ^= (1 << 7)]      10100011
[x ^= (1 << 7)]      00100011
-------------------------------------------------- 
[^x]                 11011100


[Elapsed] 369.833µs

おすすめ書籍

自分が読んだGo関連の本で、いい本って感じたものです。

Go言語による並行処理

Go言語による並行処理

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

  • 作者:松尾 愛賀
  • 発売日: 2016/04/15
  • メディア: 単行本(ソフトカバー)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com