static const unsigned char BitsSetTable256[256] =
{
# define B2(n) n, n+1, n+1, n+2
# define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
# define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
B6(0), B6(1), B6(1), B6(2)
};
这段代码在设置位问题上非常有名。我已经理解它将如何在编译时输出查找表。
但我需要更多的直觉..意味着
B2(n),B4(n),B6(n)??的含义是什么 什么是归结为这个递归宏的基本思想?
编辑 我的意思是递归背后的想法
答案 0 :(得分:0)
召回:在编译程序之前,预处理器会处理宏。 “编译”代码时会出现3个步骤:
B2(n)
将执行以下操作:
n, n + 1, n + 2
...其中n
是某个数字。
Bx
宏的重点是递归构建位表。
答案 1 :(得分:0)
“归结为此递归宏的基本概念”
B2(n)将生成:n, n+1, n+1, n+2
检查自己: -
gcc -E file_name.c
答案 2 :(得分:0)
这个想法是“递归地将问题定义为2位值”:00,01,10,11。它们不是递归宏,而是表示递归分解的技术问题。宏作为级联的排列通过解决2位(生成4个值)的问题,然后对于4位(使用2-)来解决生成2 ^ 8值表的问题。位解4次),然后为6位(使用4位解4次),然后针对整个问题(使用6位解4次)。
2位给出四个值:0,1,2,3。0设置为0,1设置为1, 2也只有1位设置,3有2位设置。
4位数的值使用相同的模式,并使用2位模式作为每个值的额外2位。
它可以“简化”到每个宏1位。
#define B1(n) n, n+1
#define B2(n) B1(n), B1(n+1),
#define B3(n) B2(n), B2(n+1),
#define B4(n) B3(n), B3(n+1),
#define B5(n) B4(n), B4(n+1),
#define B6(n) B5(n), B5(n+1),
#define B7(n) B6(n), B6(n+1),
B7(0), B7(1)
请记住,查找表的目的是用表查找howmanybits(x)
替换函数调用howmanybits[x]
。因此,表中的每个值应表示该索引i的f(i)和整体函数f。
因此,要真正掌握它,请追踪前几个值。 B6(0)
以B4(0)
开头,B2(0)
以B4(0)
开头,为0,1,1,2。f(0)= 0,f(1)= 1,f(2) = 1,f(3)= 2。 B2(1)
继续x x_2 f(x)
0 0000 0 bits set
1 0001 1
2 0010 1
3 0011 2
4 0100 1
5 0101 2
6 0110 2
7 0111 3
...
,其为1,2,3,3.f(4)= 1,f(5)= 2,f(6)= 2,f(7)= 3。如果以二进制表示法查看这些数字,应该清楚这对于这8个结果是正确的。
{{1}}