奇偶校验算法——判断二进制数中1的个数

方法1:

时间复杂度:O(logn) n为二进制数的值

 

int n;
    int res=0;
    scanf("%d",&n);
    while(n!=0){
        res+=(n&1);
        n>>=1;
    }
    printf("%d",res);

 

 

方法2:

时间复杂度:O(m) m为二进制数中1的个数

 

public class Solution {
    public int hammingWeight(int n) {
        int res=0;//初始化数量统计变量 res
        while(n!=0)//循环消去最右边的 1 ,当 n = 0 时跳出
        {
            n=n&(n-1);//消去数字 n 最右边的 1 
            res++;// 统计变量加 1 
        }
        return res;//返回统计数量 res 
    }
}

 

 

方法3:

时间复杂度:

i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
i = (i + (i >> 4)) & 0x0f0f0f0f;
i = i + (i >> 8);
i = i + (i >> 16);
i = i & 0x3f;

第一步:求出每两位二进制数中1的个数,并替代这两位二进制数

第二步:此时每两位二进制数表示的是原本这两位二进制数中1的个数,所以将他们两两相加合并

代码如下:

i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
i = (i + (i >> 4)) & 0x0f0f0f0f;
i = i + (i >> 8);
i = i + (i >> 16);

第三部:合并完成,最终得到的就是1的个数

 

posted @ 2022-09-25 14:39  Yohoc  阅读(176)  评论(0编辑  收藏  举报