C++二进制常量/文字

Unk*_*own 13 c++ binary templates constants

我使用一个众所周知的模板来允许二进制常量

template< unsigned long long N >
struct binary
{
  enum { value = (N % 10) + 2 * binary< N / 10 > :: value } ;
};

template<>
struct binary< 0 >
{
  enum { value = 0 } ;
};
Run Code Online (Sandbox Code Playgroud)

所以你可以做二进制<101011011> :: value.不幸的是,对于无符号长整数,它有20位数的限制.

有没有人有更好的解决方案?

Mar*_*som 25

如果您的二进制值具有前导零,这是否有效?前导零使得常数八进制而不是十进制.

这导致了一种从这个解决方案中挤出几个数字的方法 - 总是用零开始你的二进制常量!然后用8的模板替换模板中的10.

  • 哦,这是偷偷摸摸的:-)布拉沃. (2认同)

pax*_*blo 5

我一直使用的方法虽然不如你的优雅:

1 /只需使用十六进制.过了一会儿,你就会知道哪些十六进制数字表示哪些位模式.

2 /使用常量和OR或添加它们.例如(可能需要在位模式上使用限定符来使它们无符号或长):

#define b0  0x00000001
#define b1  0x00000002
: : :
#define b31 0x80000000

unsigned long x = b2 | b7
Run Code Online (Sandbox Code Playgroud)

3 /如果性能不重要且可读性很重要,您可以在运行时使用诸如"x = fromBin("101011011");"之类的函数来执行此操作.

4 /作为一个偷偷摸摸的解决方案,您可以编写一个预处理器来处理*.cppme文件并通过将所有"0b101011011"类型的字符串替换为其等效的"0x15b"字符串来创建*.cpp文件.我不会轻易做到这一点,因为你可能不得不担心各种棘手的语法组合.但是它允许你根据需要编写字符串,而不必担心编译器的变幻莫测,你可以通过仔细编码来限制语法的棘手.

当然,之后的下一步是修补GCC以识别"0b"常量,但这可能是一种矫枉过正:-)

  • 我想知道如果您正在建模硬件或通信协议,那么使用'二进制模板'比使用简单的十六进制常量或'或'在一起使用具有适当名称的枚举的情况更好的情况是什么? (2认同)