読者です 読者をやめる 読者になる 読者になる

xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

2 進リテラル

C#

すでに当たり前のように使っている機能ですが、C# 6.0 までは整数リテラル (整数値を表記する方法) として 10 進数と 16 進数がサポートされています。10 進数はそのまま数字を並べるだけ、16 進数は数値の前に 0x / 0X の接頭辞を付けます。

var dec = 123;   //--- 10 進数
var hex = 0x1F;  //--- 16 進数

C# 7 からはこれらに加えて 2 進数表記 (= Binary literals) も追加されます。接頭辞は 0b / 0B で、Binary の意味ですね。以下のように記述できるようになります。

var bin = 0b1011;  //--- 2 進数

利用できる数値は 0 / 1 のみです。仕様は以下に載っています。

整数リテラルは記法の問題だけなので、コンパイル時にはただの整数値として IL に埋め込まれます。2 進数表記をしたから遅くなるとかいうことは一切ありません。

こんなときに便利

よくある例がビット演算をする場合です。Flags 属性を付けた enum を作ることがあるかと思いますが、これまでは愚直に 10 進数で値を並べるかビットシフトを使って以下のように書いていました。

//--- そのまま 10 進数で値を並べる
[Flags]
enum Fruits
{
    None   = 0,
    Dog    = 1,
    Cat    = 2,
    Bird   = 4,
    Rabbit = 8,
    Other  = 16,
}


//--- シフト演算で何ビット目に 1 を立てているかを明示
[Flags]
enum Fruits
{
    None   = 0,
    Dog    = 1 << 0,  //--- 0 ビット左にシフトしたところに 1 を立てる
    Cat    = 1 << 1,
    Bird   = 1 << 2,
    Rabbit = 1 << 3,
    Other  = 1 << 4,
}

これらをより明確に記述できるようになります。

[Flags]
enum Fruits
{
    None   = 0b00000,
    Dog    = 0b00001,
    Cat    = 0b00010,
    Bird   = 0b00100,
    Rabbit = 0b01000,
    Other  = 0b10000,
}

他にも、ビットマスクをするときなどに重宝しそうです。