一个简单的计数

来源:互联网 发布:在u盘上装ubuntu 编辑:程序博客网 时间:2024/04/29 02:18

从数据结构这本书看到的,思路很巧妙啊。

题目的要求是计算一个数化为二进制数后,求这个二进制数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(2)=00001111000011110000111100001111 //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为单位分组,之后移位相加,得到的和就地储存。




0 0
原创粉丝点击