首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++二进制常量/文字

C++二进制常量/文字
EN

Stack Overflow用户
提问于 2009-03-31 02:16:56
回答 7查看 9.3K关注 0票数 13

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

代码语言:javascript
运行
复制
template< unsigned long long N >
struct binary
{
  enum { value = (N % 10) + 2 * binary< N / 10 > :: value } ;
};

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

所以你可以做一些像binary<101011011>::value这样的事情。不幸的是,对于无符号的long long,这有20位的限制。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-03-31 02:31:18

如果你的二进制值有一个前导零,这会起作用吗?前导零使常量为八进制而不是十进制。

这导致了一种从这个解决方案中挤出更多数字的方法-始终以零开始您的二进制常量!然后将模板中的10替换为8。

票数 25
EN

Stack Overflow用户

发布于 2009-03-31 02:23:28

我一直使用的方法,尽管没有你的方法那么优雅:

1/只使用十六进制。过了一段时间,你就会知道哪些十六进制数字代表哪些位模式。

2/使用常量与OR或相加。例如(可能需要比特模式上的限定符,以使其无符号或长):

代码语言:javascript
运行
复制
#define b0  0x00000001
#define b1  0x00000002
: : :
#define b31 0x80000000

unsigned long x = b2 | b7

3/如果性能不是很重要,可读性很重要,你可以在运行时使用诸如"x = fromBin("101011011");“这样的函数来实现。

4/作为一个不为人知的解决方案,您可以编写一个预处理器,它遍历您的*.cppme文件并创建*.cpp文件,方法是将所有"0b101011011"-type字符串替换为等效的"0x15b“字符串)。我不会轻率地这样做,因为您可能需要担心各种复杂的语法组合。但它将允许您随心所欲地编写字符串,而不必担心编译器的变幻莫测,并且您可以通过仔细编码来限制语法的复杂性。

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

票数 5
EN

Stack Overflow用户

发布于 2009-03-31 02:22:08

C++0x有user-defined literals,它可以用来实现你正在谈论的东西。

否则,我不知道如何改进这个模板。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/699781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档