从数据结构这本书看到的,思路很巧妙啊。
题目的要求是计算一个数化为二进制数后,求这个二进制数1的个数。这个方法是复杂度为log2W的,其中W=O( log2 n),是整数的位宽。
#define POW(c) = 1 << c//1左移C位,是2^c
#define Mask(c) (((unsigned long ) -1 ) / (pow(pow(c))+1))//这个是用来分则的,以2^c为单位分组。效果是这样的
MASK(0)=01010101010101010101010101010101 //2个为一组
MASK(1)=00110011001100110011001100110011 //4个为一组
MASK(3)=00000000111111110000000011111111 //8个为一组
int countOnes2(unsigned int n){
n = ROUND(n,0);
n = ROUND(n,1);n = ROUND(n,2);
n = ROUND(n,3);
n = ROUND(n,4);
}
这样就可以了。原理就是
、
图是盗用的。。。
随便一个数
11001010
一开始
11001010 &
01010101 =
01000000.
之后右移一位
01100101 &
01010101 =
01000101.相加
10000101 &
00110011 =
00000001.右移一位
01000010 &
00110011 =
00000010相加
00000011&
00001111=
00000011右移一位
00000001&
00001111
00000001
相加得00000100 = 4总共四个1.
以2^c为单位分组,之后移位相加,得到的和就地储存。