2.1求二进制数中1的个数

本文介绍了多种求解一个字节无符号整型变量中二进制1的个数的方法,包括位运算和分治策略,重点探讨了时间复杂度为O(1)的解决方案,适用于优化算法效率。
摘要由CSDN通过智能技术生成

2.1求二进制数中1的个数

题目:

对于一个字节(8bit)的无符号整型变量,求其中二进制表示中“1”的个数,要求算法的执行效率尽可能高。

解法一

对于二进制操作,除以一个2,原来的数字将会减少一个0。如果除的过程中有余,那么就表示当前位置有一个1。以10100010为例:

第一次除以2时,商为1010001,余为0。第二次除以2时,商为101000,余为1。

时间复杂度为O(logv)。

代码清单2.1

//2.1
int Count_2_1(BYTE v){
    int num = 0;
    while(v){
        if(v % 2 == 1)
            num++;
        v /= 2;
    }
    return num;
}

解法二

我们知道位运算同样可以达到相除的目的。在右移位过程中,需要判断最后一位是否为1。时间复杂度为O(logv)。相比于解法一,效率提高了,但是时间复杂度没有改变。

代码清单2.2

//2.2
int Count_2_2(BYTE v){
    int num = 0;
    while(v){
        num += v & 0x01;
        v >>= 1;
    }
    return num;
}

2016-04-30补充:

考虑一种输入为负数的情况。当输入为负数时,上面代码就不能很好的运行了,因为负数的二进制表示为补码的形式(补码等于反码+1,反码等于原码所有位取反),此时v向左移位的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值