4
1

More than 1 year has passed since last update.

はじめての記事投稿

【C#】1バイトの16進数を半分(ニブル)に分割する

Last updated at Posted at 2023-06-15

1バイトの16進数(例:AD)を半分(AD)に分割したい。
使用言語: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

参考文献

4
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1