首页 > 编程语言 >汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法

汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法

时间:2024-07-25 18:28:35浏览次数:9  
标签:count uint64 const Weight 16 汉明 SWAR bits

汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法

定义

汉明重量是一串符号中非零符号的个数。它等于同样长度的全零符号串的汉明距离(在信息论中,两个等长字符串之间的汉明距离等于两个字符串对应位置的不同字符的个数)。
汉明重量在常见的数据位符号串中,它是1的个数。

算法思想

基于分治的算法,将n位二进制进行分组,通过一系列位移和位运算操作,可以在常数时间内计算多个字节的汉明重量,并且不需要使用额外的内存。

简化示例

假设一个8bit的2进制串 x=abcd,efgh其中a-b 属于{0,1}
求解的输出是 ans = a+b+c+d+e+f+g+h

step1. 2bits m1= 0101 0101

x&m1 = 0b0d 0f0h
(x>>1)&m1 = 0a0c 0e0g
求和得到[a+b]_2[c+d]_2 [e+f]_2[g+h]_2,这里[x]_2表示2位二进制中1的个数

step2. 4bits m2 = 0011 0011

x&m2 = 00[c+d]_2 00[g+h]_2
(x>>2)&m2 = 00[a+b]_2 00[e+f]_2
求和得到[a+b+c+d]_4 [e+f+g+h]_4

step3. 8bits m4 = 0000 1111

x&m4 = 0000 [e+f+g+h]_4
(x>>4)&m4 = 0000 [a+b+c+d]_4
求和得到 [a+b+c+d+e+f+g+h]_8
对应的十进制值就是最终的答案

算法实现 variable-precision SWAR算法

const uint64_t m1  = 0x5555555555555555; //binary: 0101...
const uint64_t m2  = 0x3333333333333333; //binary: 00110011..
const uint64_t m4  = 0x0f0f0f0f0f0f0f0f; //binary:  4 zeros,  4 ones ...
const uint64_t m8  = 0x00ff00ff00ff00ff; //binary:  8 zeros,  8 ones ...
const uint64_t m16 = 0x0000ffff0000ffff; //binary: 16 zeros, 16 ones ...
const uint64_t m32 = 0x00000000ffffffff; //binary: 32 zeros, 32 ones
const uint64_t h01 = 0x0101010101010101; //the sum of 256 to the power of 0,1,2,3...

//This is a naive implementation, shown for comparison,
//and to help in understanding the better functions.
//This algorithm uses 24 arithmetic operations (shift, add, and).
// 朴素算法
int popcount64a(uint64_t x)
{
    x = (x & m1 ) + ((x >>  1) & m1 ); //put count of each  2 bits into those  2 bits 
    x = (x & m2 ) + ((x >>  2) & m2 ); //put count of each  4 bits into those  4 bits 
    x = (x & m4 ) + ((x >>  4) & m4 ); //put count of each  8 bits into those  8 bits 
    x = (x & m8 ) + ((x >>  8) & m8 ); //put count of each 16 bits into those 16 bits 
    x = (x & m16) + ((x >> 16) & m16); //put count of each 32 bits into those 32 bits 
    x = (x & m32) + ((x >> 32) & m32); //put count of each 64 bits into those 64 bits 
    return x;
}

详细步骤

详细步骤
优化算法

//This is better when most bits in x are 0
//This algorithm works the same for all data sizes.
//This algorithm uses 3 arithmetic operations and 1 comparison/branch per "1" bit in x.
// 适用于0比较多的数
// 数字 n中最低位的 1 总是对应 n - 1 中的 0
// 将 n 和 n - 1 进行与运算总是能把 n 中最低位的 1 变成 0,并保持其他位不变
int popcount64d(uint64_t x)
{
    int count;
    for (count=0; x; count++)
        x &= x - 1;
    return count;
}

// 常用写法
int hammingWeight(uint32_t n) {
    int count = 0;
    
    while( n ){
        count ++;
        n &= n-1;
    }
    
    return count;
}

// 查表法 用空间换时间 从而得到O(1)的最优算法
// 以4bit的串为例,可以构造一个数组int counts[16]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}.
// 对于4bit的x, x的hamming weight为:counts[x].
static unsigned char wordbits[65536] = { bitcounts of ints between 0 and 65535 };
static int popcount(uint32 i)
{
    return (wordbits[i&0xFFFF] + wordbits[i>>16]);
}

参考

Hamming weight WIKI
汉明权重(hamming weight) ----- 计算数据位中1的个数

标签:count,uint64,const,Weight,16,汉明,SWAR,bits
From: https://blog.csdn.net/z2014z/article/details/140610798

相关文章

  • 持续学习中避免灾难性遗忘的Elastic Weight Consolidation Loss数学原理及代码实现
    训练人工神经网络最重要的挑战之一是灾难性遗忘。神经网络的灾难性遗忘(catastrophicforgetting)是指在神经网络学习新任务时,可能会忘记之前学习的任务。这种现象特别常见于传统的反向传播算法和深度学习模型中。主要原因是网络在学习新数据时,会调整权重以适应新任务,这可能会导致之......
  • 十一、【机器学习】【监督学习】- 局部加权线性回归 (Locally Weighted Linear Regres
     系列文章目录第一章【机器学习】初识机器学习第二章【机器学习】【监督学习】-逻辑回归算法(LogisticRegression)第三章【机器学习】【监督学习】-支持向量机(SVM)第四章【机器学习】【监督学习】-K-近邻算法(K-NN)第五章【机器学习】【监督学习】-决策树(D......
  • java设计模式(十二)享元模式(Flyweight Pattern)
    1、模式介绍:        享元模式是一种结构型设计模式,旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态(可共享)和外部状态(不可共享)来减少内存消耗和提高性能。内部状态存储在享元对象内部,而外部状态则由客户端代码管理和传递。2、应用场景:......
  • docker swarm 网络架构
    dockerswarm网络架构swarm网络网络架构OverlayNetwork:Swarm使用Overlay网络来实现跨主机容器的通信。Overlay网络在每个节点上创建虚拟网络,用于连接不同主机上的容器。优点:容器可以跨节点直接通信,简化了网络配置。缺点:可能会增加一些网络开销,影响到延迟和吞吐量。......
  • 【鸿蒙 HarmonyOS】尺寸设置:size/layoutWeight/constraintSize
    一、背景常见尺寸:width(宽度)、height(高度)、padding(内边距)、margin(外边距)主要整理下size(设置高宽尺寸)、layoutWeight(对子组件进行重新布局)、constraintSize(设置约束尺寸,组件布局时,进行尺寸范围限制)二、size:设置高宽尺寸可以通过size来设置宽高尺寸,当然也可以直接给组件设置宽......
  • docker swarm集群部署
      1、创建docker集群manger(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)dockerswarminit--advertise-addr10.1.62.59上面命令执行后,加入swarm集群,输出的信息中包含了节点加入集群的方式:[root@hadoop1~]#dockerswarminit--advertise-addr10.......
  • 划重点来了,计算机组成原理之计算机存储介绍与汉明码纠错
    存储器 1.分类(1)按存储介质分类:存储介质是能寄存”0“或"1"两种代码的物质或元器件。包括半导体器件,磁性材料,光盘等。半导体存储器:半导体器件组成的存储器。断电后数据会丢失,易失性存储器。磁表面存储器:在金属或塑料基体的表面涂的一层磁性材料。按载磁体形状不同,分为......
  • DockerUI结合cpolar内网穿透远程管理维护本地docker和swarm集群
    文章目录......
  • POI2007ODW-Weights
    进制#背包dp#贪心注意到呈倍数的性质,考虑按照倍数转换进制,贪心的选择小的按顺序选择//Author:xiaruizeconstintINF=0x3f3f3f3f3f3f3f3f;constintMOD=1000000007;constintN=2e5+10;intn,m;inta[N],b[N];piis[N];intcnt[N];vector<int>vec;int......
  • Docker Swarm模式下创建服务认证harbor
    dockerservicecreate--with-registry-auth 命令是在DockerSwarm模式下创建服务时使用的,它允许Docker将本地的注册表认证信息(如私有仓库的登录凭证)随着服务创建命令一起发送出去,使得Swarm集群中的每个节点在拉取受保护的私有仓库镜像时无需单独登录。具体用法如下:dockers......