1バイトの16進数(例:AD
)を半分(A
とD
)に分割したい。
使用言語:C# 10.0
右側(下位のニブル)の取得
AD
から右側のD
を取得する。
AD
を2進数に直すと1010 1101
となる。
ここから0000 1101
を取得するには、0000 1111
でANDマスクすればいい。
byte source = 0xAD;
// ANDマスクで下位4bitだけにする
byte loNibble = (byte)(source & 0b_0000_1111);
Console.WriteLine(loNibble); // 13
// 16進数で表示
string loNibbleStr = Convert.ToString(loNibble, toBase: 16).ToUpper();
Console.WriteLine(loNibbleStr); // D
左側(上位のニブル)の取得
AD
から左側のA
を取得する。
AD
を2進数に直すと1010 1101
となる。
右に4bitシフトすれば、1010
が取得できる。
(追記)当初は左側の4bitだけ残るようにANDマスクしてから右シフトしていましたが、右シフトするだけでOKでした。
byte source = 0xAD;
// 4bit右シフトする。
byte hiNibble = (byte)(source >> 4);
Console.WriteLine(hiNibble); // 10
// 16進数で表示
string hiNibbleStr = Convert.ToString(hiNibble, toBase: 16).ToUpper();
Console.WriteLine(hiNibbleStr); // A
拡張メソッドを定義
拡張メソッドにしておくと便利。
public static byte GetLowNibble(this byte source)
{
// ANDマスクで下位4bitだけにする
return (byte)(source & 0b_0000_1111);
}
public static byte GetHighNibble(this byte source)
{
// 4bit右シフトする。
return (byte)(source >> 4);
}
呼び出し方
byte source = 0xAD;
Console.WriteLine($"上位:{source.GetHighNibble()}"); // 上位:10
Console.WriteLine($"下位:{source.GetLowNibble()}"); // 下位:13
(追記)タプルで返す拡張メソッド
コメントでご指摘いただいた通り、上位と下位のニブルをタプルにして返すとさらに便利。
public static (byte high, byte low) GetNibble(this byte source)
{
return ((byte)(source >> 4), // 上位4bit
(byte)(source & 0b_0000_1111)); // 下位4bit
}
呼び出し方。相方が迷子になりづらくて良い。
byte source = 0xAD;
// ニブルを取得
var nibble = source.GetNibble();
Console.WriteLine($"上位:{nibble.high}"); // 上位:10
Console.WriteLine($"下位:{nibble.low}"); // 下位:13