0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Goで学ぶコンピューターサイエンスAdvent Calendar 2024

Day 1

【Goで学ぶコンピューターサイエンス】ビットとバイト

Last updated at Posted at 2024-12-03

ビット

「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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?