Unity & C# 学習教材

ビットパッキング(補足)

bool[] flags = new bool[8] は 8 つの真偽値を格納できますが、1 要素が内部的に 1 バイト以上占有します。これを 1 バイト(byte)の各ビットに詰め込むことで、メモリを節約しつつビット演算の練習にもなります。これをビットパッキングと呼びます。

学習目標

前提知識


1. 概念:bool[8] と byte の対応

byte は 8 ビットで、各ビットを独立したフラグとして扱えます。

ビット位置 7 6 5 4 3 2 1 0 1 0 1 0 0 1 0 1 bool[] T F T F F T F T byte = 0b10100101 = 165

ビット 7 が bool[0](最上位ビット)、ビット 0 が bool[7](最下位ビット)に対応させます。


2. Pack:bool[] → byte

bool 配列を byte に変換するには、各要素が true のときに対応ビットを OR で立てます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool[] flags = { true, false, true, false, false, true, false, true };

byte Pack(bool[] flags)
{
    byte result = 0;
    for (int i = 0; i < 8; i++)
    {
        if (flags[i])
        {
            result |= (byte)(1 << (7 - i));  // ビット (7-i) を立てる
        }
    }
    return result;
}

byte packed = Pack(flags);
Console.WriteLine(packed);           // 165
Console.WriteLine($"0b{Convert.ToString(packed, 2).PadLeft(8, '0')}");
// 0b10100101

ポイント:


3. Unpack:byte → bool[]

byte から bool 配列に戻すには、各ビット位置を AND マスクで確認します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool[] Unpack(byte packed)
{
    bool[] result = new bool[8];
    for (int i = 0; i < 8; i++)
    {
        result[i] = (packed & (1 << (7 - i))) != 0;
    }
    return result;
}

bool[] restored = Unpack(packed);

foreach (bool b in restored)
{
    Console.Write(b ? "T " : "F ");
}
// T F T F F T F T

ポイント:


4. ラウンドトリップ確認

Pack → Unpack を経ても元の配列が復元されることを確認します。

1
2
3
4
5
6
7
8
9
10
11
bool[] original = { true, false, true, false, false, true, false, true };
byte packed      = Pack(original);
bool[] restored  = Unpack(packed);

for (int i = 0; i < 8; i++)
{
    Console.WriteLine($"[{i}] {original[i]} -> {restored[i]} {(original[i] == restored[i] ? "✓" : "✗")}");
}
// [0] True -> True ✓
// [1] False -> False ✓
// ...

5. BitArray クラス

System.Collections.BitArray を使うと、同様の操作をより簡単に行えます。

1
2
3
4
5
6
7
8
using System.Collections;

var bits = new BitArray(new bool[] { true, false, true, false, false, true, false, true });

// byte に変換
byte[] bytes = new byte[1];
bits.CopyTo(bytes, 0);
Console.WriteLine(bytes[0]);  // 165(環境により LSB/MSB の順が異なる場合あり)

BitArray は AND・OR・XOR 演算をそのままメソッドで呼び出せる便利なクラスです。ただし、ビット順(LSB/MSB)や動作の細かい違いがあるため、本ページで紹介した手動実装の仕組みを先に理解しておくと応用が効きます。


まとめ


理解度チェック

  1. flags = { false, false, false, false, true, true, true, true }Pack するといくつになりますか?

  2. byte packed = 0b11110000Unpack すると result[4] はどうなりますか?

解答を見る
  1. ビット 3〜0 が立ちます。0b00001111 = 15 です。

  2. ビット 3(1 << (7-4) = 1 << 3 = 8)は 0b11110000 & 8 = 0 なので false です。


次のステップ

多次元配列 では、行列形式のデータを 2 次元配列で扱う方法を学びます。