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

又被阿里机考虐了一次,决定改变策略开始刷题T^T

 

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

 

最先想到的移位操作,末尾位&00000001,然后右移,算法复杂度为O(log(v))

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int Count(int v);
 6 int main()
 7 {
 8     int v = 255;
 9     int num = Count(v);
10     cout<<num<<endl;
11     return 0;
12 }
13 
14 int Count(int v)
15 {
16     int num = 0;
17     while(v)
18     {
19         num += v &0x01;
20         v >>= 1;
21     }
22     return num;
23 }

 

还有一种算法复杂度为O(1)的,就是利用查表法,空间来换取时间,经典的理念。

http://blog.csdn.net/justpub/article/details/2292823

但是,看了上述博客后,发现弊端,这个操作需要访问内存,运行时间比法一长很多。

 

【扩展】:给定两个正整数(二进制表示)A和B,问把A变成B需要改变多少位,也就是说,两者的二进制表示中有多少位不同?

取一个C = A^B,C中1的个数就是A和B不同的位数。

 

posted on 2015-04-07 22:09  夏大兔  阅读(191)  评论(0编辑  收藏  举报

导航