除了按位遍历外,还有什么办法知道一个2进制有多少个1?

nobody@noone 2009-09-27 03:49:01
除了按位遍历外,还有什么办法知道一个2进制有多少个1?
因为我觉得,开关有10多个的情况下,在这类判断有循环的话,数据量一大,系统开销也跟着变得很大,所以不太想用循环来判断

10进制45,二进101101
10进制32,二进100000
foo(45)= 4
foo (32) = 1

这个foo改如何写比较好呢?
或者说能实现另一个功能,就是比较哪个数在二进制下1比较多也成,
...全文
246 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nobody@noone 2009-09-28
  • 打赏
  • 举报
回复
谢谢大家,按先后及有效顺序给分,零碎的分给了热心观众,再次谢谢大家
wyw1520 2009-09-27
  • 打赏
  • 举报
回复
少了个0
wyw1520 2009-09-27
  • 打赏
  • 举报
回复
每一位与运算下,再将这些的BOOL类型值求和可以不?比喻(INT)[bool(101101与00001)+boll(101101与00010)+....]不知道行得通不
arong1234 2009-09-27
  • 打赏
  • 举报
回复
1+(n&(n-1))?
用户 昵称 2009-09-27
  • 打赏
  • 举报
回复
		i = xxxxx;
j = 0;

while( i )
{
i &= ( i - 1 );
j++;
}
challenge99 2009-09-27
  • 打赏
  • 举报
回复
int bit4_tab[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 2, 3, 3, 4};

for(; x != 0; x = x >> 4) {
count += bit4_tab[x & 0xf];
}
forster 2009-09-27
  • 打赏
  • 举报
回复
查表 取一次表的地址估计就比这多了
forster 2009-09-27
  • 打赏
  • 举报
回复
凡是用循环肯定加入无用指令,效率不能看写的代码多少
forster 2009-09-27
  • 打赏
  • 举报
回复
自己写个让编译器/Ox优化,40多指令 都是短周期的
估计基本上最快的把


struct s
{
char b1:1;
char b2:1;
char b3:1;
char b4:1;
char b5:1;
char b6:1;
char b7:1;
char b8:1;

int foo(){return b1+b2+b3+b4+b5+b6+b7+b8;}
};

[code=Assembly]
?foo@s@@QAEHXZ PROC ; s::foo, COMDAT
; _this$ = eax

; 17 : int foo(){return b1+b2+b3+b4+b5+b6+b7+b8;}

mov cl, BYTE PTR [eax]
mov dl, cl
shl dl, 7
movsx eax, dl
mov dl, cl
shl dl, 6
movsx edx, dl
sar edx, 7
sar eax, 7
add eax, edx
mov dl, cl
shl dl, 5
movsx edx, dl
sar edx, 7
add eax, edx
mov dl, cl
shl dl, 4
movsx edx, dl
sar edx, 7
add eax, edx
mov dl, cl
add dl, dl
add dl, dl
add dl, dl
movsx edx, dl
sar edx, 7
add eax, edx
mov dl, cl
add dl, dl
add dl, dl
movsx edx, dl
sar edx, 7
add eax, edx
mov dl, cl
add dl, dl
movsx edx, dl
movsx ecx, cl
sar edx, 7
add eax, edx
sar ecx, 7
add eax, ecx
ret 0
?foo@s@@QAEHXZ ENDP ; s::foo


[/code]
whg01 2009-09-27
  • 打赏
  • 举报
回复
这个方法的原理就是从低bit到高bit,消除v中二进制的1。
whg01 2009-09-27
  • 打赏
  • 举报
回复
《编程之美》里面有5种解法。
最特殊的是下面这个:
int Count(int v)
{
int num = 0;
while (v)
{
v &=(v-1);
num++;
}
reutrn num;
}
速度最快的还是查表。可以每个字节做一个表。int型查4次。
starcat 2009-09-27
  • 打赏
  • 举报
回复
In a two's complement number system, x &= (x-1) deletes the rightmost 1-bit in x. Explain why. Use this observation to write a faster version of bitcount.

#include <stdio.h>
int bitcount(unsigned x)
{
int b;
for(b = 0; x != 0; x &= (x-1))
b++;
return b;
}
main()
{
unsigned int y;
int n;
scanf("%d",&y);
n = bitcount(y);
printf("there is %d one bits in y.\n",n);
}
铖邑 2009-09-27
  • 打赏
  • 举报
回复
可以分成高低四位,然后相加
bfhtian 2009-09-27
  • 打赏
  • 举报
回复

int count=0;
while(n){
count++;
n&=n-1;
}
cout<<n;

taodm 2009-09-27
  • 打赏
  • 举报
回复
查表法。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧