【问题标题】:Bit Reversal: Generating Bit Reversal Lookup Table for N-Bits位反转:为 N 位生成位反转查找表
【发布时间】:2012-11-21 09:22:15
【问题描述】:

我正在尝试做一些反转,我理解直接的实现,但出于性能目的,我需要通过构建一个查找表并使用该表来查找位反转来反转位,所以我的程序将构建一个查找位大小 N 的表,然后它将使用该表查找给定位的位反转。

例如,如果 bitSize = 9 且 num = 6 (00000110)

reverse(num,bitSize) 将返回 192,即 11000000

int lookup(int num, int bitSize)
{
    return table[bitSize][num]; // == reverse(num,bitSize);
}

我认为查找函数应该是这样的,有人告诉我可以构建表,但我不知道如何构建,有人可以解释如何构建这个表吗?

我只是想澄清一下,我正在寻找一种方法来为给定的 bitSize 构建此表,而不仅仅是 32 位,否则我会使用这种方法: http://graphics.stanford.edu/~seander/bithacks.html#BitReverseTable

感谢您的帮助,

编辑: 由于 j_random_hacker 的内存优化,这两种解决方案都有效,但 kmkaplan 的解决方案更高效。

【问题讨论】:

  • 是什么阻止您使用直接的实现来生成表?另请注意,一个 32 位数字的表占用 16 GB。
  • 其实没什么,我也觉得,应该用reverse(num,bitSize)来生成表格,但是不知道怎么生成表格,不太懂表格的方法...
  • 位大小永远不会超过 12 位,所以大小不是大问题,速度才是。
  • 如果 bitSize 是 12 位,那么 Bit Twiddling Hacks 技术有什么问题?
  • 您不需要为每个“位大小”设置单独的表。只需为最大位大小制作一个表,然后根据需要将查找结果右移到其中。具体来说,如果您在 n 位表中查找 k 位结果,则需要将结果右移 n-k 位。

标签: c++ c algorithm bit-manipulation


【解决方案1】:

对于 12 位表:

int table[1<<12]; // or 4096
int i;

for (i=0;i<4096;i++) table[i] = my_straight_forward_bitreverse(12,i);

那么你必须解决其他位长度的问题。
要么有一个数组 int table[12][4096];大约 90% 空置。

或者有

int table12[4096], table11[2048], table10[1024] /* , ...*/ ;  
int *table[12]={ table1, table2, /*  ...  */ table12 };

int i, j;
for (j=0;j<12;j++) 
  for (i=0;i<1<<j;i++) table[j][i]=my_straight_forward_bitreverse(j+1,i); 

【讨论】:

  • 谢谢!我明天试试,结果告诉你。
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
  const int bitSize = atoi(argv[1]);

  printf("static unsigned int table[] = {");
  unsigned int i;
  for (i = 0; i < 1 << bitSize; i++) {
    if ((i & 7) == 0)
      printf("\n");
    unsigned int v = i;
    unsigned int r = 0;
    int s = bitSize;
    while (s--) {
      r <<= 1;
      r |= v & 1;
      v >>= 1;
    }
    printf(" 0x%x,", r);
  }
  printf("\n};\n"
         "unsigned int lookup(int num, int bitSize)\n"
         "{\n"
         "        return table[num] >> (%d - bitSize);\n"
         "}\n",
         bitSize
         );

  return 0;
}

编辑:实现 j_random_hacker 内存优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多