由查找表设置的位 - 递归宏

时间:2013-08-10 06:50:40

标签: c recursion macros bit preprocessor-directive

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)??的含义是什么 什么是归结为这个递归宏的基本思想?

编辑 我的意思是递归背后的想法

3 个答案:

答案 0 :(得分:0)

召回:在编译程序之前,预处理器会处理宏。 “编译”代码时会出现3个步骤:

  1. 预处理(处理所有预处理器指令)。
  2. 将C源文件编译为目标文件(转换为机器代码)。
  3. 将所有目标文件和其他库标识链接到一个可执行文件中。
  4. 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}}