作为二进制压缩为无符号整数的无符号整数半字节



我用无符号整数表示二进制。例如:0x1111存储为0xf(15)
我知道已经有了像BOOST_BINARYC++14二进制文字和表示二进制数的宏技巧这样的解决方案
我只是想通过模板(受阶乘示例的启发)来实现这一点
下面的解决方案对于我手头的任务来说绰绰有余。

关于如何用模板而不是宏(也没有C++14,只有C++11)将其扩展到uint64_t以上,或者如何改进这个/循环孔,有什么想法吗?我只是好奇
感谢

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

在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

是在编译时计算的二进制文字。

实例

二进制输出的大小受64位int的限制。输入自然限制为64位。不使用前缀。在编译时进行错误检查以消除非0和非1值是可能的。

最新更新