2進定数の書き方

Home > 2005-11 / 実装技術 > This Entry [com : 0][Tb : 0]

2005-11-29

 CにもC++にも、2進数を直接記述する方法がありません。しかし、定数に2進数を使いたくなることも少なくありません。コンパイラによっては、0b〜とか、0y〜とかの記法を使って2進数を使えるようにする拡張がサポートされている場合もありますが、このような拡張機能を使うと、CPUが変更になった場合など、大変な目に遭うことは必至です。

そこで、C++のテンプレートとマクロを組み合わせて、2進数を記述する方法を紹介したいと思います。テンプレートを使うので、実行時に計算する必要もなく、完全にコンパイル時に解決可能な汎整数定数式としてあつかうことができます。

template <int Bit> struct bit;

template <> struct bit<0>
{ static const int value = 0; };

template <> struct bit<1>
{ static const int value = 1; };

template <unsigned long N>
struct binary
{
    static const unsigned long value
        = bit<N & 7>::value | (binary<N >> 3>::value << 1);
};

template <>
struct binary<0>
{ static const unsigned long value = 0; };

#define B(x) (binary<0##x>::value)



簡単に説明すると、テンプレート引数Nに、2進数を8進リテラルの形で指定し、再帰的なテンプレートで2進数に変換しています。bit構造体は、Nの各桁に0または1以外を指定した場合にコンパイルエラーを発生させるためのものです。

使い方はこんな感じです。

int x = B(0101); /* 0x05 */



難を挙げると、unsigned longを使ってはいますが、内部的に一旦8進数を使っている関係上、longが32ビットの場合は11ビットしか表現できないことです。long long型をサポートしている処理系では、22ビットまで表現できるので、もう少し利用範囲が広がるかと思います。

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/42-ae047cc9

C++と組み込み環境 | Page Top▲

New >>
平方根定数
<< old
タイプセーフなデータキュー
ブログ内検索
RSSフィード