概要
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関連の本で、いい本って感じたものです。
- 作者:Katherine Cox-Buday
- 発売日: 2018/10/26
- メディア: 単行本(ソフトカバー)
- 作者:松尾 愛賀
- 発売日: 2016/04/15
- メディア: 単行本(ソフトカバー)
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者:Alan A.A. Donovan,Brian W. Kernighan
- 発売日: 2016/06/20
- メディア: 単行本(ソフトカバー)
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場