【发布时间】: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