我正在使用一个众所周知的模板来允许二进制常量
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位的限制。
有人有更好的解决方案吗?
发布于 2009-03-31 02:31:18
如果你的二进制值有一个前导零,这会起作用吗?前导零使常量为八进制而不是十进制。
这导致了一种从这个解决方案中挤出更多数字的方法-始终以零开始您的二进制常量!然后将模板中的10替换为8。
发布于 2009-03-31 02:23:28
我一直使用的方法,尽管没有你的方法那么优雅:
1/只使用十六进制。过了一段时间,你就会知道哪些十六进制数字代表哪些位模式。
2/使用常量与OR或相加。例如(可能需要比特模式上的限定符,以使其无符号或长):
#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“常量,但这可能是矫枉过正:-)
发布于 2009-03-31 02:22:08
C++0x有user-defined literals,它可以用来实现你正在谈论的东西。
否则,我不知道如何改进这个模板。
https://stackoverflow.com/questions/699781
复制相似问题