時折、1つだったはずのデータが泣き別れになって得られることがあります。
たとえば、上位バイトは0x12で下位バイトは0x34といった感じです。
これを合体させて0x1234にするにはどうすれば良いのでしょうか。
文字列に置き換えて結合しますか?
数値のままで結合はできます。
これには2つの機能を使います。
- ビットシフト演算子<< 1バイトは8bitだから8bitシフトさせると上位バイトになる
- OR演算子| 値が"1"のビットを合体させて2つの値を1つにまとめる
つまり、こういうことです。
- 下位バイトはそのまま使う
- 上位バイトは8bit左シフトさせることで、正しい桁に合わせられる
- 両者をOR演算子で合体させると、上位バイトと下位バイトを合体した値になる
罠の数々 §
- OR演算子の結果は加算などと同じく最低でもint型の幅になってしまうので、キャストでushortに強制している
- :xは16進出力を行うための指定だ。
参考リンク §
ビットごとの演算子とシフト演算子 (C# リファレンス)
シフトしすぎると値が1のビットが表現可能な範囲を飛び出してしまう。たとえばushort型は16bitしかないので、16回シフトするとビットは全て飛び出してしまう。飛び出したビットはどこに行ってしまうのだろうか。上記のリンクから確かめてみよう。
リポジトリ §
https://github.com/autumn009/cshowto
ShiftBits §
using System;
class Program
{
static void Main()
{
byte high = 0x12;
byte low = 0x34;
ushort combined = (ushort)(low | high << 8);
Console.WriteLine($"{combined:x}");
}
}
実行結果
1234