【问题标题】:bits set by lookup table - Recursive macro [duplicate]查找表设置的位 - 递归宏[重复]
【发布时间】:2013-08-10 06:50:39
【问题描述】:
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)是什么意思??
以及归结为这个递归宏的基本思想是什么?

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

【问题讨论】:

  • 这不是归结为宏的想法,而是相反。除此之外:宏可以有参数。 #define B2(n) n, n+1, n+1, n+2 表示每当遇到B2(somenumber) 时,都会被预处理器替换为somenumber, somenumber+1, somenumber+1, somenumber+2
  • 文本替换的宏函数,B2(n) 将创建这个 n, n+1, n+1, n+2 文本,其中 n 是一个数字

标签: c recursion macros bit preprocessor-directive


【解决方案1】:

这个想法是“将问题递归定义为 2 位值”:00、01、10、11。它们不是递归宏,但确实代表了递归分解的技术问题。将宏排列为 级联 通过解决 2 位(生成 4 个值)的问题,然后解决 4 位(使用 2-位解 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) 开头,依次为0、1、1、2。f(0)=0, f(1)=1, f(2)=1, f(3 )=2。 B4(0) 继续 B2(1),依次为 1、2、2、3。f(4)=1,f(5)=2,f(6)=2,f(7)=3。如果您以二进制表示形式查看这些数字,应该清楚这 8 个结果是正确的。

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
...

【讨论】:

  • 这里的 n 是什么,我认为 B6(0) 足以生成所有组合 .. 那么为什么 B6(1)、B6(1)、B6(2)
  • B6(n) 只给你 6 位的数字。 “乘以 2,乘以 2”表示多 2 位,这就是为什么定义中有 4 个 B6 实例,以填写 8 位值的值。 “我认为 B6(0) 足以生成所有连击”记住我们在 binary 中:[0,1] 足以生成所有连击。
  • 明白了,谢谢...
【解决方案2】:

“归结为这个递归宏的基本思想”

B2(n) 将生成:n, n+1, n+1, n+2

检查自己:-

gcc -E file_name.c

【讨论】:

    【解决方案3】:

    回想一下:在编译程序之前,预处理器会处理宏。 “编译”代码时会发生 3 个步骤:

    1. 预处理(处理所有预处理器指令)。
    2. 将 C 源文件编译成目标文件(翻译成机器代码)。
    3. 将所有目标文件和其他库文件链接到一个可执行文件中。

    B2(n) 将执行以下操作:

    n, n + 1, n + 2
    

    ...n 是某个数字。


    Bx 宏的全部意义在于递归地构建位表。

    【讨论】:

    • 我知道......我想要递归背后的想法......请参阅@luser droog ans..无论如何谢谢......
    猜你喜欢
    • 2018-06-25
    • 2016-06-28
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2014-06-01
    相关资源
    最近更新 更多