《编程之美》——求二进制数中1的个数

原创 2015年11月18日 12:28:43

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

分析与解法:

【解法一】
每次除2取余,若为奇数则累加,最终累加结果为“1”的个数。
如,10100010除以2,商为1010001,余数为0;1010001除以2,商为101000,余数为1。时间复杂度O(log2v)

代码:

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

【解法二】
将数字与00000001进行“与”操作,若结果为1,说明数字最后一位是1,累加,然后对数字进行右移。
位操作比算数运算的效率高,但时间复杂度仍为O(log2v)

代码:

int Count(int v)
{
    int num = 0;
    while(v)
    {
        if(v & Ox01)
            num++;
        v >>= 1;
    }
    return num;
} 

但是如果v为负数,因为每次右移高位补的数字是其符号位,那么最终v会变成0xFFFFFFFF而陷入死循环。

改进的代码为:

int Count(int v)
{
    int num = 0;
    //将无符号的0x00000001进行左移,从而避免了v右移出现死循环的情况
    unsigned int flag = 1;
    while(flag)
    {
        if(v&flag)
            num++;
        flag <<= 1;
    }
    retrun num;
} 

【解法三】
v & (v -1)操作每次能消去数字二进制表示中最后一位1,该操作的次数即为数字中“1”的个数。
时间复杂度为O(m),m为v中1的个数。

代码:

int Count(int v)
{
    while(v)
    {
        v &= (v - 1);
        num++;
    }
} 

【解法四】
因为数字只有8位,可以使用空间换时间。查表法,类似map的思想,即将每个数字中1的个数记录在数组中,v作为数组的下标,每次只要直接查找arr[v]的值,时间复杂度为O(1)

扩展问题:

  1. 如果变量是32位DWORD,使用或改进上述哪个算法?
  2. 求整数A与B二进制表示的汉明距离。

分析与解法:

【问题1】
由于数字长度较大,不能使用解法四,可以使用解法三或改进解法二。

【问题2】
可以先将A与B异或,得到的数值再求其中“1”的个数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

《编程之美》读书笔记——“求二进制数中1的个数”

《编程之美》读书笔记——“求二进制数中1的个数” 2008-04-15 09:51 14641人阅读 评论(35) 收藏 举报 编程读书算法面试编译器活动    《编程之美——微...
  • pi9nc
  • pi9nc
  • 2014年04月18日 21:21
  • 1174

求二进制数中1的个数——《编程之美》

求二进制中1的个数。对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。先来看看样章上给出的几个算法:解法一 ,每次除二,看是否为奇数,是的话就累计加一,最后...

《编程之美》读书笔记——“求二进制数中1的个数”(转自http://blog.csdn.net/justpub/article/details/2292823)

《编程之美——微软技术面试心得》读书笔记 “求二进制数中1的个数” by ZelluX    由电子工业出版社博文视点和w3china.org社区联合举办了“看样章, 写书评, 赢取《编程...
  • xjbzju
  • xjbzju
  • 2011年10月13日 20:34
  • 975

2.1《编程之美》读书笔记——“求二进制数中1的个数”

《编程之美》读书笔记——“求二进制数中1的个数”by ZelluX  下面文章来自读者ZelluX: 求二进制中1的个数。对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效...
  • johnlxj
  • johnlxj
  • 2011年03月08日 14:48
  • 280

求二进制数中1的个数(编程之美)

求二进制数中1的个数继京东618店庆时买的《编程之美》这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下。书中的题目如下...

编程之美求二进制数中1的个数扩展题

转自:http://s.sousb.com/?p=253 编程之美2.1节中的扩展题第1题:如果变量是32位的Dword,则如何统计该二进制数中1的个数。 对于该题,原本的想法还是想采用书...

求二进制数中1的个数(剑指offer10 编程之美2.1)

1.借助栈,先求这个数的二进制表示,然后计算1的个数

编程之美-求二进制数中1的个数方法整理

【试题描述】 方法一:穷举法(暴力搜索) 方法二:使用位操作 方法三: 方法四:使用分支操作 方法五:查表法,时间复杂度O(1...

求二进制数中1的个数.pdf

  • 2011年12月03日 12:13
  • 257KB
  • 下载

编程之美2.1——求二进制树中1的个数

问题: 对一个4字节的无符号整形变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。   解法一(位遍历法):使用位操作,移位后来判断是否有1存在,利用v&0x01和v>>=1。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《编程之美》——求二进制数中1的个数
举报原因:
原因补充:

(最多只允许输入30个字)