如何生成16位LookUp表来计算设置位

Tom*_*asz 1 c lookup bit

我正在寻找解决方案如何生成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)
};
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在16位中做到这一点

ana*_*lyg 5

我将解释该代码是如何工作的,因此很容易扩展它.

可以轻松计算2位数的LUT:

0, 1, 1, 2
Run Code Online (Sandbox Code Playgroud)

那是:

  • 二进制'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
Run Code Online (Sandbox Code Playgroud)

在一般情况下,如果你的LUT为N位:

0, 1, 1, 2, 1, 2, ...
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为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
Run Code Online (Sandbox Code Playgroud)

通过宏实现将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)
...
Run Code Online (Sandbox Code Playgroud)