无符号整数半字节被视为二进制压缩为无符号整数

时间:2016-03-24 17:37:32

标签: c++ templates c++11 template-meta-programming

我已经提出以下内容来表示使用无符号整数的二进制文件。例如:0x1111存储为0xf(15) 我知道已有解决方案,如BOOST_BINARYC++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 个答案:

答案 0 :(得分: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值的错误。