汉明重量(swar算法)

SWAR(SIMD within a Register),顾名思义,就是在一个寄存器上进行单指令多数据流(single instruction, multiple data)操作,在很多地方都有应用。显然,数值i确实可以只用单个寄存器来存储,不需要额外的存储空间。并且上述方法执行的都是位运算和加法操作,现代处理器对这些都有特殊的优化,效率非常高,并且还消灭了相对比较耗时的分支和跳转操作。

uint32_ t swar (uint32_ t n) {
    //步骤1, 计算相邻两位中1的数量,计算结果覆盖到原数中
    n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
    //步骤2,计算相邻四位中1的数量, 计算结果覆盖到原数中
    n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
    //步骤3, 计算相邻八位中1的数量,计算结果覆盖到原数中
    n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
    //步骤4, n * (0x01010101)=(n<<24)+(n<<16)+(n<<8)+n, 相当于把i的所有8位一起的分组求和
    n = (n * (0x01010101) >> 24);
    return n;
}

redis中的汉明重量算法:
https://zhuanlan.zhihu.com/p/146025115

java中的汉明重量算法(文章里讲了其他算法):
https://www.jianshu.com/p/b0db1f072a66

另外还可参考剑指offer LCR 133,leetcode 191

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部