2016-03-24 8 views
1

符号なし整数を使用してバイナリを表現するには、次のものを用意しました。例:0x11110xf(15)として格納されます。
私はすでにBOOST_BINARYC++14バイナリ番号を表すバイナリリテラルとマクロトリックのような解決策があることを知っています。
私はちょうどテンプレート(ファクタリールの例に触発されている)でこれを動作させたいと思っていました。
次の解決策は、私の仕事のために十分です。符号なし整数ニブルは、符号なし整数に圧縮されたバイナリとして扱われます

これをテンプレートとマクロでなくC++14(ただしC++11のみ)を使用してuint64_t以上に拡張する方法や、この/ループホールを改善する方法はありますか?ただ興味があるだけ。 C++ 14では

template <> 
struct Uint64Nibbles2Binary<0x0> 
{ 
    enum {value = 0x0}; 
}; 

template <uint64_t num> 
struct Uint64Nibbles2Binary 
{ 
    enum 
    { 
    value = (Uint64Nibbles2Binary<(num >> 4)>::value << 0x1) | (num & 0x1); 
    }; 
}; 
+1

他に何もない場合は、16進数よりも8進数で多くの桁を絞り込むことができます。 – doynax

答えて

2


おかげで、ちょうど0b1111を使用しています。そして、終わった。彼らは組み込みのバイナリリテラルをサポートしています。

C++ 11では、operator""を使用します。次いで

constexpr int64_t make_binary() { return 0; } 

template<class...Rest> 
constexpr int64_t make_binary(char C, Rest...rest) { 
    return ((C=='1') << sizeof...(Rest)) + make_binary(rest...); 
} 

template <char...Cs> 
constexpr int64_t operator"" _binary() { 
    static_assert(sizeof...(Cs) <= 64, "Binary value has too many bits"); 
    return make_binary(Cs...); 
} 

111011110101101_binary 

は、コンパイル時に計算バイナリリテラルです。

live example

バイナリ出力の大きさは64ビット整数により制限されます。もちろん、入力は64ビットに制限されています。接頭辞を使用しないでください。非0と非1の値をコンパイル時に排除するエラーチェックが可能です。