我使用一个众所周知的模板来允许二进制常量
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位数的限制.
有没有人有更好的解决方案?
如果您的二进制值具有前导零,这是否有效?前导零使得常数八进制而不是十进制.
这导致了一种从这个解决方案中挤出几个数字的方法 - 总是用零开始你的二进制常量!然后用8的模板替换模板中的10.
我一直使用的方法虽然不如你的优雅:
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"常量,但这可能是一种矫枉过正:-)