又被阿里机考虐了一次,决定改变策略开始刷题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不同的位数。