当前位置:  开发笔记 > 编程语言 > 正文

C++二进制常量/文字

如何解决《C++二进制常量/文字》经验,为你挑选了2个好方法。

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

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

template<>
struct binary< 0 >
{
  enum { value = 0 } ;
};

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

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



1> Mark Ransom..:

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

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


哦,这是偷偷摸摸的:-)布拉沃.

2> paxdiablo..:

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

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

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

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

unsigned long x = b2 | b7

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

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

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


我想知道如果您正在建模硬件或通信协议,那么使用'二进制模板'比使用简单的十六进制常量或'或'在一起使用具有适当名称的枚举的情况更好的情况是什么?
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有