ビット
「binary digit」の略。
ビット (bit)は、データの最小単位のことで、0または1の値をとります。
複数ビットを組み合わせることで、様々なデータを表現します。
ビット | 状態 | パターン |
---|---|---|
1ビット | 0, 1 | $2^1$ |
2ビット | 00, 01, 10, 11 | $2^2$ |
3ビット | 000, 001, ..., 111 | $2^3$ |
... | ... | ... |
8ビット | 00000000, 00000001, ...,11111111 | $2^8$ |
バイト
8ビットをひとかたまりとしたものが、1バイトです。
0~255(符号なし)、-128~127(符号付き)、ASCIIの1文字などを表現することが可能です。
これらがどのようなデータを表現しているかは、それを扱うアプリケーション側で判断されます。
ビット演算
ここからはGoのコードを使って、ビット操作をしてみようと思います。
Goでは以下のようなビット演算子が利用可能です。
演算子 | 説明 | 使用例 (A=1010, B=1100) | 結果 |
---|---|---|---|
& | AND: 両方が1なら1 | A & B | 1000 |
| | OR: どちらかが1なら1 | A | B | 1110 |
^ | XOR: 異なれば1 | A ^ B | 0110 |
<< | 左シフト: 指定桁数分移動 | A << 2 | 101000 |
>> | 右シフト: 指定桁数分移動 | A >> 2 | 0010 |
ビット演算のGoサンプルコード
package main
import "fmt"
func main() {
A := 10 // 2進数: 1010
B := 12 // 2進数: 1100
// AND演算
andResult := A & B
fmt.Printf("A & B = %d (2進数: %04b)\n", andResult, andResult)
// OR演算
orResult := A | B
fmt.Printf("A | B = %d (2進数: %04b)\n", orResult, orResult)
// XOR演算
xorResult := A ^ B
fmt.Printf("A ^ B = %d (2進数: %04b)\n", xorResult, xorResult)
// 左シフト
leftShift := A << 2
fmt.Printf("A << 2 = %d (2進数: %06b)\n", leftShift, leftShift)
// 右シフト
rightShift := A >> 2
fmt.Printf("A >> 2 = %d (2進数: %04b)\n", rightShift, rightShift)
}
A & B = 8 (2進数: 1000)
A | B = 14 (2進数: 1110)
A ^ B = 6 (2進数: 0110)
A << 2 = 40 (2進数: 101000)
A >> 2 = 2 (2進数: 0010)
ビット演算を使ったフラグ管理Goサンプルコード
package main
import "fmt"
const (
Read = 1 << 0 // 001
Write = 1 << 1 // 010
Exec = 1 << 2 // 100
)
func main() {
// 権限を組み合わせて設定
permission := Read | Write
fmt.Printf("Permission: %03b\n", permission) // 011 (Read + Write)
// 権限の確認
fmt.Printf("Has Read: %t\n", permission&Read != 0) // true
fmt.Printf("Has Write: %t\n", permission&Write != 0) // true
fmt.Printf("Has Exec: %t\n", permission&Exec != 0) // false
// 権限の追加 (Exec権限を付与)
permission |= Exec
fmt.Printf("Permission after adding Exec: %03b\n", permission) // 111
// 権限の削除 (Write権限を削除)
permission &= ^Write
fmt.Printf("Permission after removing Write: %03b\n", permission) // 101
}
Permission: 011
Has Read: true
Has Write: true
Has Exec: false
Permission after adding Exec: 111
Permission after removing Write: 101
バイト操作のGoサンプルコード
package main
import "fmt"
func main() {
// 文字のバイト表現
char := 'A' // ASCII文字
fmt.Printf("Character: %c, Binary: %08b\n", char, char) // A, 01000001
// 文字列のバイト配列
str := "Go"
fmt.Printf("String: %s\n", str)
fmt.Printf("Bytes: %v\n", []byte(str))
for i, b := range []byte(str) {
fmt.Printf("Byte %d: %08b (%c)\n", i, b, b)
}
// バイト配列を結合
bytes := []byte{71, 111} // G: 01000111, o: 01101111
fmt.Printf("Reconstructed String: %s\n", string(bytes))
}
Character: A, Binary: 01000001
String: Go
Bytes: [71 111]
Byte 0: 01000111 (G)
Byte 1: 01101111 (o)
Reconstructed String: Go