经典算法学习-计算汉明权重 SWAR(SIMD within a register)

计算汉明权重算法 SWAR(SIMD within a register)

参考文章:

[1] 简书:计算汉明权重的SWAR(SIMD within a Register)算法https://www.jianshu.com/p/b0db1f072a66

[2]维基百科:SWAR https://en.wikipedia.org/wiki/SWAR

[3]Hacker’s Delight[M].Henry S. Warren

简述:

这个专栏记录一些看到的经典算法,既然想不出来,只能努力去学习;

算法目标:

计算二进制串汉明权重;

汉明权重,一个二进制子串中1的个数;

!

经典算法学习-计算汉明权重 SWAR(SIMD within a register)

实现思想:

分治算法,

  • 先将两个比特视为一组,共16组,计算每组有多少个1;
i = (i & 0x55555555) + ((i >> 1) & 0x55555555);
  • 通过上一句,已经得到了在16组范围在[0,2]之间的结构,接下来在此基础上将每4个比特视为一组,判断其中有多少个1;
i = (i & 0x33333333) + ((i >> 2) & 0x33333333)
  • 我们已经得到了8组范围在[0, 4]之间的结果,接下来在此基础上将每8个比特(即上一步的每两组)视为一组,一共4组,计算每组中有多少个1。
i = (i & 0x0F0F0F0F) + ((i >> 4) & 0x0F0F0F0F)
  • 接下来继续依照分治思想,两两合并即可
public static int bitCount(int i) {
    i = (i & 0x55555555) + ((i >> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
    i = (i & 0x0F0F0F0F) + ((i >> 4) & 0x0F0F0F0F);
    i = (i & 0x00FF00FF) + ((i >> 8) & 0x00FF00FF);
    i = (i & 0x0000FFFF) + ((i >> 16) & 0x0000FFFF);
    return i;
}

这样,只需要单个寄存器和时间复杂度为O(1)就可以实现对32位整数的汉明权重计算;

Original: https://www.cnblogs.com/Albert-lihai/p/16650973.html
Author: Albert_禄遥
Title: 经典算法学习-计算汉明权重 SWAR(SIMD within a register)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644205/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球