我正在寻找解决方案,如何生成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位

最佳答案

我将解释代码是如何工作的,所以很容易扩展它。
2位数字的LUT可以很容易地计算:

0, 1, 1, 2

即:
二进制'00'有0个设置位
二进制'01'有1个设置位
二进制'10'有1个设置位
二进制'11'有2个设置位
现在尝试为4位数字构建一个LUT共有16个数字,可列举如下:
二进制'00xx',其中xx是任何2位数字
二进制'01xx',其中xx是任意2位数字
二进制“10xx”,其中xx是任意2位数字
二进制'11xx',其中xx是任何2位数字
此枚举使您可以方便地计算设置位:
二进制'00xx'有0+B2(xx)个设置位
二进制'01xx'有1+B2(xx)个设置位
二进制'10xx'有1+B2(xx)个设置位
二进制'11xx'有2+B2(xx)个设置位
因此,4位数字的LUT将如下所示:
0, 1, 1, 2,
1, 2, 2, 3,
1, 2, 2, 3,
2, 3, 3, 4

一般情况下,如果你有N位的LUT:
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)
...

10-07 20:39