宏-生成4位查找表

时间:2018-07-14 19:26:01

标签: c macros bit

下面是位反转(8位)的查找表

  static const unsigned char BitReverseTable256[256] = 
{
  #   define R2(n)     n,     n + 2*64,     n + 1*64,     n + 3*64
  #   define R4(n) R2(n), R2(n + 2*16), R2(n + 1*16), R2(n + 3*16)
  #   define R6(n) R4(n), R4(n + 2*4 ), R4(n + 1*4 ), R4(n + 3*4 )
      R6(0), R6(2), R6(1), R6(3)
};

下面的链接解释了其背后的算法。但是我并不完全理解它。 Look-up table for 8 bit reversal

我想要类似的宏用于4位反转,以便可以理解8位。 有人可以提供相同的宏进行4位反转。

谢谢

1 个答案:

答案 0 :(得分:1)

对于4位整数,您的查询表大小为16,即pow(2, 4)。 我将从手动枚举开始,以便我们找出是否存在模式:

Integer  Binary Representation  Reverse Binary Representation   Reverse Value

0            0000                        0000                        0
1            0001                        1000                        8
2            0010                        0100                        4
3            0011                        1100                        12
4            0100                        0010                        2
5            0101                        1010                        10
6            0110                        0110                        6
7            0111                        1110                        14
8            1000                        0001                        1
9            1001                        1001                        9 
10           1010                        0101                        5
11           1011                        1101                        13
12           1100                        0011                        3
13           1101                        1011                        11
14           1110                        0111                        7
15           1111                        1111                        15

请注意,在Reverse Binary Representation列中,最左边的(最高有效2位)以相同的方式递增,即每隔四次00 10 01 11

类似地,请注意,在Reverse Binary Representation列中,最右边的(最低有效2位)也采用相同的模式,即00 10 01 11,但一次执行四次。

二进制数字0 1 2 3 00 01 10 {{1} },并且如果您将每个反向:11 00 10 01,您将得到11 0 2 {{1 }}!

1 3 0 2将作为基础,我们将使用以下等式进行概括:

13nn + 2 * 4

提示:尝试使用以上公式导出列n + 1 * 4。 例, 前四个值从n = 0得出

n + 3 * 4

我已经很长时间没有写C了,但是我想你应该(我会被纠正的):

Reverse Value

在Python中:

0         = 0
0 + 2 * 4 = 8
0 + 1 * 4 = 4
0 + 3 * 4 = 12

但是,基于宏的解决方案对于4位而言可能会过大。您可以只初始化一组反向值。

无论如何,我希望这能帮助您理解模式。