我正在寻找解决方案如何生成16位,65536个元素查找表来计算设置位。我知道要生成8位表我可以使用:
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)
};
但我不知道如何在16位中做到这一点
答案 0 :(得分:5)
我将解释该代码的工作原理,因此很容易扩展它。
可以轻松计算2位数的LUT:
0, 1, 1, 2
那是:
现在尝试为4位数字构建一个LUT。共有16个数字,可以按如下方式列举:
此枚举可让您轻松计算设定位:
所以4位数字的LUT看起来像这样:
0, 1, 1, 2,
1, 2, 2, 3,
1, 2, 2, 3,
2, 3, 3, 4
在一般情况下,如果您的LUT为N位:
0, 1, 1, 2, 1, 2, ...
您可以将其转换为N + 2位的LUT:
0, 1, 1, 2, 1, 2, ...
1, 2, 2, 3, 2, 3, ... // all numbers as above plus 1
1, 2, 2, 3, 2, 3, ... // another row of numbers, the same
2, 3, 3, 4, 3, 4, ... // all numbers as above plus 1
通过宏实现将1添加到先前的数字。要将表格继续为16,只需添加更多行:
# define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
# define B8(n) B6(n), B6(n+1), B6(n+1), B6(n+2)
# define BA(n) B8(n), B8(n+1), B8(n+1), B8(n+2)
...
答案 1 :(得分:2)
我会这样说:
static const unsigned char BitsSetTable65536[65536] =
{
# 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)
# define B8(n) B6(n), B6(n+1), B6(n+1), B6(n+2)
# define B10(n) B8(n), B8(n+1), B8(n+1), B8(n+2)
# define B12(n) B10(n), B10(n+1), B10(n+1), B10(n+2)
# define B14(n) B12(n), B12(n+1), B12(n+1), B12(n+2)
B14(0),B14(1), B14(1), B14(2)
};