我正在尝试进行一些反转,我理解直接实现,但出于性能目的,我需要通过构建查找表并使用该表来查找位反转来反转位,所以我的程序将构建一个查找表的bitsize 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的解决方案更有效。
答案 0 :(得分:2)
对于12位表:
int table[1<<12]; // or 4096
int i;
for (i=0;i<4096;i++) table[i] = my_straight_forward_bitreverse(12,i);
然后你必须解决其他位长的问题 要么有一个数组int表[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);
答案 1 :(得分:1)
#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内存优化。