首页 > 编程语言 >经典算法学习-计算汉明权重 SWAR(SIMD within a register)

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

时间:2022-09-02 19:11:36浏览次数:86  
标签:0x0F0F0F0F 权重 within 算法 汉明 SWAR 0x33333333

计算汉明权重算法 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的个数;

!

实现思想:

分治算法,

  • 先将两个比特视为一组,共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位整数的汉明权重计算;

标签:0x0F0F0F0F,权重,within,算法,汉明,SWAR,0x33333333
From: https://www.cnblogs.com/Albert-lihai/p/16650973.html

相关文章

  • 如何将docker swarm的manager节点降级为worker节点?
    将manager降级为worker 这个问题,说来挺有意思的,我在集群里面创建了2个manager,然后,模拟将第2个manager节点,从集群中移出去,结果发现报错了: [root@nccztsjb-node-07......
  • LISTAGG(字段名, ‘|‘) WITHIN GROUP(ORDER BY **) 使用
    LISTAGG(字段名,‘|’)WITHINGROUP(ORDERBY**)//配合分组一起使用-LISTAGG(字段名,‘|’)接收两个参数第一个:需要数据拼接的字段-字段名第二个:使用什么字符进......
  • 在docker swarm中,如何对一个service进行滚动升级?
    滚动升级,一定听过,就比如说,现在有个服务运行了多个实例,想要对这个服务进行升级(比如:更换镜像),应该怎么弄呢? 接下来的部分,咱们一起来看下。 在本文中,做滚动升级的一个场......
  • docker swarm集群中,task是什么意思?
    你在查看dockerswarm文档的时候,是不是经常听说task这个词,是什么意思呢? 非常,非常的简单: 在dockerswarm中,service中的容器,就叫做task. Container=task ......
  • 如何在docker swarm集群中部署一个service?
     如果你想知道,如何在dockerswarm集群中部署一个service,那么你需要仔细的阅读下面的文章····· 1、前提 如果想要完成本次文章的内容,你首先需要一个swarm集群......
  • 力扣477(java)-汉明距离总和(中等)
    题目: 两个整数的 汉明距离指的是这两个数字的二进制数对应位不同的数量。给你一个整数数组nums,请你计算并返回nums中任意两个数之间汉明距离的总和。 示例1:......
  • docker swarm容器编排学习笔记
    1、介绍DockerSwarm 和DockerCompose一样,都是Docker官方容器编排项目不同点:DockerCompose是一个在单个服务器或主机上创建多个容器的工具,DockerSwarm则可以......
  • 九、docker swarm主机编排
    一、什么是DockerSwarmSwarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm,它是将一群......