c - 长整数中单个位的索引(在 C 中)

标签 c bit-manipulation bit pseudocode

<分区>

我试图找到一个最佳代码来定位长整数(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/

相关文章:

c - 三个延迟加号

c - 运行时检查失败 #0 : Why am I getting this and what does it mean?

c - C 中的 Bit Twiddling - 计算 2 倍 x 或返回最大有符号数

c - union 和内存管理

c - 如何有效地设置一个字节的最后三位?

c - 理解浮点二进制模型

c - 将地址传递给 C 中的函数

python - 读取在 C 中使用 Python struct 编写的二进制数据

c - 屏蔽 C 中参数给定范围内的位

c - 为什么 0x1 被解释为小于 0xC0000000?