我也来出个好玩的题

16 views
Skip to first unread message

SpitFire

unread,
Nov 15, 2007, 4:49:04 AM11/15/07
to pon...@googlegroups.com
计算出正整数N二进制1的个数

--
SpitFire

Atry

unread,
Nov 15, 2007, 5:13:26 AM11/15/07
to pon...@googlegroups.com
int numberOfOne;
for(;;) {
  numberOfOne += N & 1;
  N >>= 1;
}
return numberOfOne;

2007/11/15, SpitFire <spit...@gmail.com >:
计算出正整数N二进制1的个数

--
SpitFire


SpitFire

unread,
Nov 15, 2007, 6:45:35 AM11/15/07
to pon...@googlegroups.com
比较正统的回答,时间复杂度可以继续下降

在07-11-15,Atry <pop....@gmail.com> 写道:



--
SpitFire

Fisher

unread,
Nov 15, 2007, 7:00:07 AM11/15/07
to pon...@googlegroups.com
如果N的位数确定,时间复杂度可以O(1)

SpitFire

unread,
Nov 15, 2007, 8:47:24 AM11/15/07
to pon...@googlegroups.com
就一般的64位好了

在07-11-15,Fisher <yuf...@gmail.com> 写道:



--
SpitFire

Fisher

unread,
Nov 15, 2007, 9:30:12 AM11/15/07
to pon...@googlegroups.com
ms是这样的?

int _n = 0;
_n = ((N & 0xAAAAAAAA) >> 1) + (N & 0x55555555);
_n = ((_n & 0xCCCCCCCC) >> 2)) + (_n & 0x33333333);
_n = ((_n & 0xF0F0F0F0) >> 4) + (_n & 0x0F0F0F0F);
_n = ((_n & 0xFF00FF00) >> 8) + (_n & 0x00FF00FF);
_n = ((_n & 0xFFFF0000) >> 16) + (_n & 0000FFFF);
return _n;

li jiecong

unread,
Nov 15, 2007, 9:42:25 AM11/15/07
to pon...@googlegroups.com
a=~x
number=0
x--;
while( a & x){
number++;
x--;
}

 
On 11/15/07, SpitFire <spit...@gmail.com> wrote:
计算出正整数N二进制1的个数

--
SpitFire
Message has been deleted

li jiecong

unread,
Nov 15, 2007, 9:59:39 AM11/15/07
to pon...@googlegroups.com
错了 应该是这样吧
 
number = 0;
if ( 1==x){
    number = 1;
}
 
while( ~x & (x-1)){
     number ++
     x &=(x-1)

SpitFire

unread,
Nov 15, 2007, 10:08:54 AM11/15/07
to pon...@googlegroups.com
基本上是这样了
int i = 0;
while( n &= n-1) ++i;

在07-11-15,li jiecong <liji...@gmail.com> 写道:



--
SpitFire

SpitFire

unread,
Nov 15, 2007, 10:10:30 AM11/15/07
to pon...@googlegroups.com
哦,i = 1,do while是i = 0

2007/11/15, SpitFire <spit...@gmail.com>:



--
SpitFire

hayate

unread,
Nov 15, 2007, 10:13:07 AM11/15/07
to pon...@googlegroups.com
n = 0呢?
这时 i 应该等于 0

oldrev

unread,
Nov 15, 2007, 11:24:00 AM11/15/07
to pon...@googlegroups.com
有点意思

SpitFire

unread,
Nov 15, 2007, 9:23:33 PM11/15/07
to pon...@googlegroups.com
这个移植性相对不那么好,不过性能倒是不是,在linux源码里有专门的宏

在07-11-16,oldrev <old...@gmail.com> 写道:
--
SpitFire
Reply all
Reply to author
Forward
0 new messages