gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:43:18 25 4
gpt4 key购买 nike

我想出了以下使用无符号整数表示二进制的方法。例如: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);
};
};

最佳答案

在 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 值。

关于c++ - 无符号整数半字节被视为二进制压缩为无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com