2016-03-24 37 views
1

我已經拿出以下內容來表示使用無符號整數的二進制文件。例如:0x1111存儲爲0xf(15)
我知道,已經有像BOOST_BINARY,C++14二進制文字和宏技巧來表示一個二進制數的解決方案。
我只是希望得到這個模板的工作(受到因子例子的啓發)。
以下解決方案對我手頭的任務已經足夠了。將無符號整數半字節視爲二進制壓縮爲無符號整數

任何想法如何擴展到uint64_t與模板,而不是宏(也沒有C++14但只有C++11)或如何改善這個/循環漏洞?我只是好奇。
由於

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

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

那麼,如果沒有別的東西,你可以擠在八進制比十六進制更多的數字。 – doynax

回答

2

在C++ 14,只要使用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位INT限制。自然,輸入被限制爲64位。不使用前綴。在編譯時檢查以消除非0和非1值的錯誤是可能的。

相關問題