求二进制数中1的个数

本文介绍了一种高效算法来计算一个无符号字节(8位)中二进制表示1的个数。通过将数值减1并进行按位与运算,可以有效地将每个1置0并计数,直至数值变为0。这种方法的时间复杂度为O(1的个数),相较于遍历每一位的简单方法更加高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个一个字节(8位)的无符号整型数,求它的二进制数表示中1的个数。

分析:一个比较容易想到的方法是从低位到高位判断是否为1,每得到一位就把这个数右移,这样只需取最低位即可。时间复杂度是O(logv),其中logv是这个数的位数。如果还想进一步降低时间复杂度,我们可以只关注那些数位上为1的位。对于一个二进制数(比如11010000),我们可以这样找到它里面的1:把这个数减一(11010000 - 1 = 11001111),这样做是为了将最低位的一个1找到后并把这个1变为0(将这俩数按位与即可),同时我们计数器记下这个找到的最低位的1。以此类推直到这个数变为0,这样我们既找到了所有的1,又使得时间复杂度降为O(1的个数)。

int NumsOfOne(Byte v){
    int count = 0;
    while(v){
        v &= (v - 1);
        count++;
    }
    return count;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值