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;
}
}
コメントを書く