<分区>
我试图找到一个最佳代码来定位长整数(64 位)中的单个位索引。长整数只有一个设置位。 (使用C语言)
目前,我只是将整个内容移动一位,然后检查是否为零。我已经阅读了查找表,但它不适用于整个 64 位。我考虑过检查每 8 位是否为零,如果不使用查找,但我仍然必须一次移动 8 位。 (8次移位比8次移位好?)
(注意:我正在为移动设备开发,它们 [毫不奇怪] 很慢)。
<分区>
我试图找到一个最佳代码来定位长整数(64 位)中的单个位索引。长整数只有一个设置位。 (使用C语言)
目前,我只是将整个内容移动一位,然后检查是否为零。我已经阅读了查找表,但它不适用于整个 64 位。我考虑过检查每 8 位是否为零,如果不使用查找,但我仍然必须一次移动 8 位。 (8次移位比8次移位好?)
(注意:我正在为移动设备开发,它们 [毫不奇怪] 很慢)。
最佳答案
每当我需要某种方式来操作位时,我总是寻找 Bit Twiddling Hacks .对于您的问题,它也几乎没有解决方案。
这个解决方案似乎是快速且最先进的:
Count the consecutive zero bits (trailing) on the right in parallel
unsigned int v; // 32-bit word input to count zero bits on right
unsigned int c = 32; // c will be the number of zero bits on the right
v &= -signed(v);
if (v) c--;
if (v & 0x0000FFFF) c -= 16;
if (v & 0x00FF00FF) c -= 8;
if (v & 0x0F0F0F0F) c -= 4;
if (v & 0x33333333) c -= 2;
if (v & 0x55555555) c -= 1;
对于 N 位字,操作次数最多为 3 * lg(N) + 4。
关于c - 长整数中单个位的索引(在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997894/