以 O(1) 计算汉明权重 [重复]

2024-05-18

在二进制表示中,汉明权重是 1 的数量。我偶然发现了网络并找到了一个 O(1) 的答案:

v = v - ((v>>1) & 0x55555555);
v = (v & 0x33333333) + ((v>>2) & 0x33333333);
int count = ((v + (v>>4) & 0xF0F0F0F) * 0x1010101) >> 24;

但是我不太理解该算法,也无法在任何地方找到它的描述。有人可以解释一下吗,特别是最后一行(*0x1010101 然后 >> 24 到底是什么意思)?


这是用于计数位的分而治之策略的一部分,称为“填充”函数。对这一策略的学术处理可以在 Reingold 和 Nievergelt, 1977 中找到。

这个想法是首先对位进行求和,然后按 4 次求和,然后按 8 次求和,依此类推。例如,如果您有位1011,然后第一对10变成01因为有一位,第二位就变成了10因为10 = 2以二进制表示,有两个位11。这里的基本事实是:

population(x) = x - (x/2) - (x/4) - (x/8) - (x/16) - ... etc.

您拥有的确切算法是所谓的“HAKMEM”算法的变体(参见 Beeler、Gosper 和 Schroppel,1972)。这个算法算数1并行在 4 位字段中,然后将这些和转换为 8 位和。最后一步是通过乘以将这 4 个字节相加的操作0x01010101. The 0x0F0F0F0Fmask 通过屏蔽掉非和信息来获取 4 个字节的和。例如,假设 8 维字段是10110110,那么有 5 位等于0101,因此我们将有10110101。只有最后四位是有效的,因此我们屏蔽掉前四位,即:

10110101 & 0x0F = 00000101

您可以在亨利·沃伦 (Henry Warren) 所著的《黑客之乐》一书中找到有关位计数细节的完整章节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以 O(1) 计算汉明权重 [重复] 的相关文章

  • 按步长值变化对数组中的数字进行分组

    我有一个像 101 107 106 199 204 205 207 306 310 312 312 314 317 318 380 377 379 382 466 469 471 472 557 559 562 566 569 在这个数组中
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 如何去交织位(UnMortonizing?)

    从 32 位 int 中解交织位的最有效方法是什么 对于这种特殊情况 我只关心奇数位 尽管我确信将任何解决方案推广到这两个集合都很简单 例如我想转换0b01000101 into 0b1011 最快的方法是什么 EDIT 在这个应用程序中
  • 比较两棵树的伪代码

    这是我遇到过几次的问题 并且不确信我使用了最有效的逻辑 例如 假设我有两棵树 一棵是文件夹结构 另一棵是该文件夹结构的内存 模型 我希望比较两棵树 并生成一棵树中存在的节点列表 而不是另一棵树中存在的节点列表 反之亦然 是否有公认的算法来处
  • for循环增量语句中的奇数位运算符[重复]

    这个问题在这里已经有答案了 鉴于这个 for 循环 for i i lt MAX N i i i 它是什么意思 声明的内容是什么i i i完成 这种循环经常在二叉索引树 或 BIT 实现中观察到 这对于在对数时间内更新范围或点以及查询范围或
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 在大文件中查找重复项

    我有一个非常大的文件 大约有 1500 万个条目 文件中的每一行都包含一个字符串 称为键 我需要使用 java 查找文件中的重复条目 我尝试使用哈希图并检测重复的条目 显然 这种方法向我抛出了 java lang OutOfMemoryEr
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 查找数组中 2 个缺失数字的最快方法

    这个问题的存在只是出于纯粹的好奇心 不是作业 找到在数组 1 n 中找到两个缺失数字的最快方法 因此 在相关帖子中 查找数字数组中缺失数字的最快方法 https stackoverflow com questions 2113795 qui
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 插入排序 - 如何接受输入并打印排序后的数组

    我试图做一个插入排序程序 它接受任何数据类型 Int Double String 然后打印排序后的数组 我知道我的代码可以工作 但我无法找出真正的问题 import java util public class MyInsertionSor
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 找到一个恰好出现了 N/2 次的数字

    这是我的面试问题之一 给定一个包含 N 个元素的数组以及元素出现的位置正好 N 2次 其余 N 2 个元素是unique 您如何找到运行时间更好的元素 请记住 元素未排序 您可以假设 N 是偶数 例如 input array 10 2 3
  • javascript - 找到在一定限制下给出最大总和的子集(子集总和)

    我有一个包含一些整数值的数组 我需要获取它们的子集 该子集给出小于给定值的最大总和 假设我有这个数组 40 138 29 450 我想获得该数组的一个子集 使总和最大化 但低于用户给出的限制 比如说 250 在这种情况下 它应该返回 139
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 为什么 n & (n - 1) 总是从 n 中清除 1 位?

    给定一个数字n 按位运算n n 1 总是产生一个与 1 位相差的数字n 以下是一些示例 n 4 gt b 100 b 011 b 000 n 5 gt b 101 b 100 b 100 n 6 gt b 110 b 101 b 100 换
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set

随机推荐