c - 两个位置之间的人口计数

标签 c performance algorithm bit-manipulation bioinformatics

我正在寻找一种在两个位置之间的位串中查找弹出计数的解决方案 例如:

popcnt( 10(0101), 0, 3) = 1
popcnt( 100101(), 0, 0) = 0
popcnt( 10010(1), 0, 1) = 0

** 我假设开放范围并假设从右到左的顺序

使用标准位运算符和可能的 popcnt 或等价物。

如果它有所不同,我正在寻找两个字符串差异之间的 popcnt。假设我有字符串 b 并且我在两个位置交换位,例如 0101110 -> 1101100 => 3 - 我需要 popcnt 更改的位 - 在 0101110 -> 1101100 的情况下,两者之间的位为 10110,因此 popcnt 为 3

您是否看到一些巧妙的方法可以使用 bithacks 做到这一点?

最佳答案

首先屏蔽值以仅获取相关位:

relevant = (value >> startBit) & ((1 << numOfBits) - 1);

编辑:

numOfBits == 32(或者更准确地说,当 numOfBits == CHAR_BIT * sizeof(int))时,上面的代码将调用未定义的行为。要解决此问题,您需要对这种情况进行特殊处理(设置 relevant = value)。


然后使用此问题中提出的方法之一找到这些位的总体计数:Best algorithm to count the number of set bits in a 32-bit integer .

总结一下答案,您可以使用特定于平台的函数,例如 GCC 的 __builtin_popcount,或者如果您需要一个可移植的解决方案,您可以使用并行前缀算法,例如 Matt Howells 的算法回答:

int NumberOfSetBits(int i)
{
    i = i - ((i >> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
    return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

关于c - 两个位置之间的人口计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13729127/

相关文章:

c - 如何在 C 中将 Ulong 转换为 Lptstr

c - gdb: 当前上下文中没有符号 "i"

java - 从文本文件中按单词查找最长的句子

arrays - 在 O(n) 时间和 O(1) 空间中找到排序数组 A[1..n] 中的两个整数,使得 a = 3b - 7

c - 打印结构体的浮点值

c - 如何等待任何/所有 pthread 完成?

mysql - 什么是 MySQL "Key Efficiency"

Java String.replace() 或 StringBuilder.replace()

performance - Powershell在4.0环境下如何加速启动?

c# - 如何在C#中实现维特比算法来拆分连体词?