c - C 中的位计数类似于 bit twiddling hack

标签 c bit-manipulation counter bit

我需要制作一个不涉及循环(仅位操作)并且不使用大常量的字中的位计数例程。

int x = 0xFFFFFFFF;
x += (~((x >> 1) & 0x55555555)+1);
x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
x = (((x >> 4) + x) & 0x0F0F0F0F);
x += (x >> 8);
x += (x >> 16);
return(x & 0x0000003F);

这是我在 bit twiddling hacks 上发现的,但我可以使用的最大常量是 0xFF...否则我不知道该怎么做。

谢谢各位。

最佳答案

例如,您可以使用常量数组 COUNTS[16],它是从 0 到 15 的二进制表示中设置的位数。然后:

static inline int byte_count (int x) {
  static const int COUNTS[16] = { 0, 1, 1, 2, 1, /* fill in the rest manually */ };
  return COUNTS[x & 15] + COUNTS[x >> 4];
}

int count(int x) {
  return byte_count(x >> 24) + byte_count((x >> 16) & 255) + byte_count((x >> 8) & 255) + byte_count(x & 255);
}

没有循环,也没有大于 255 的常量。

关于c - C 中的位计数类似于 bit twiddling hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092659/

相关文章:

c# - ASP.NET 应用程序状态 - 创建 "requests per minute"计数器

Jmeter计数器最大值重新初始化

C - 我可以在不指定每个槽大小的情况下创建一个二维数组吗

c - 如何旋转2D Controller 的映射

c - C 中按位运算符的性能

java - 如何比较 RGB 值,忽略 alpha

python - How to do a bitwise NOR Gate in Python(编辑 python 数学为我工作)

php - mysql pdo 命中计数器

c - 二维数组中最快的搜索算法

c - 二进制表达式 C 的无效操作数