bool配列 と byte配列 の変換方法

bool配列 と byte配列 の変換方法

bool と byte の変換方法

bool型配列からbyte型やbyte型配列、あるいはその逆を求める方法をまとめました。標準的な方法ではうまくやれないようなので、独自に拡張メソッドで定義することにします。

bool型配列 を byte型配列 に変換

bool型配列 を byte型配列 に変換するメソッドです。

まずbyte型変数を0で初期化しておきます。最大8ビット分ループして、最上位ビットから順にビットを立てていきます。

具体的には “0000001” をビットシフトし任意の桁数のみ 1 の byte値を作ります。これで用意しておいた変数とのOR演算を行います。OR演算なのでもとから1が立っている桁はそのままで、任意の桁について1を設定できます。

8bit に足りない場合も当然考えられますが、足りない部分は 0 になります。for文最後の “yield return” を消せば、8bitに足りないbit変換しないようにもできますのでご自由に。

bool[] => byte[]

// bool[] => byte[]
public static IEnumerable<byte> BitsToBytes(this IEnumerable<bool> bits)
{
    int i = 0;
    byte result = 0;
    foreach (var bit in bits)
    {
        // 指定桁数について1を立てる
        if (bit) result |= (byte)(1 << 7 - i);

        if (i == 7)
        {
            // 1バイト分で出力しビットカウント初期化
            yield return result;
            i = 0;
            result = 0;
        }
        else
        {
            i++;
        }
    }
    // 8ビットに足りない部分も出力
    if (i != 0) yield return result;
}

bool型配列 を byte型 に変換

これは上のbyte型配列への変換で先頭要素のみを返すようにするだけです。FirstOrDefault() を使用することで、要素がなくても 0 を返すようにしています。

bool[] => byte

// bool[] => byte
public static byte BitsToByte(this IEnumerable<bool> bits)
{
    return bits.BitsToBytes().FirstOrDefault();
}

以下の例は bool型配列を byte型、byte型配列にそれぞれ変換する処理のサンプルです。bool配列[9]をbyte型に変換します。

bool型配列 の byte型配列 変換まとめ

9bit中、先頭8bit分と末尾1bitをそれぞれ byte型に変換します。末尾1bitの変換で足りない7bitはすべて0として扱われるのが確認できます。

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        // 01010101 1_______ = 85 128
        var bits = new bool[] { false, true, false, true, false, true, false, true, true };

        // bool[] => byte[]
        Console.WriteLine("bool[] => byte[]");
        var bytes = bits.BitsToBytes();
        foreach (var bt in bytes)
        {
            Console.WriteLine(bt);
        }

        // bool[] => byte
        Console.WriteLine("bool[] => byte");
        Console.WriteLine(bits.BitsToByte());
    }
}

public static class Extentions
{
    // bool[] => byte
    public static byte BitsToByte(this IEnumerable<bool> bits)
    {
        return bits.BitsToBytes().FirstOrDefault();
    }

    // bool[] => byte
    public static IEnumerable<byte> BitsToBytes(this IEnumerable<bool> bits)
    {
        int i = 0;
        byte result = 0;
        foreach (var bit in bits)
        {
            // 指定桁数について1を立てる
            if (bit) result |= (byte)(1 << 7 - i);

            if (i == 7)
            {
                // 1バイト分で出力しビットカウント初期化
                yield return result;
                i = 0;
                result = 0;
            }
            else
            {
                i++;
            }
        }
        // 8ビットに足りない部分も出力
        if (i != 0) yield return result;
    }
}

C#カテゴリの最新記事