首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数二进制后的有几个0或者1 ?

2012-03-16 
求一个数二进制后的有几个0或者1 ??将一个数转换为二进制后,求其后面有几个0或者1??[解决办法]晕,有个地方

求一个数二进制后的有几个0或者1 ??
将一个数转换为二进制后,求其后面有几个0或者1   ??

[解决办法]
晕,有个地方写错了 c 忘记清空了,

这个才是对的


#include "stdio.h "


int main()
{
int n = 0;
int c = 0;

while (1)
{
printf( "请输入你要测试的整数(输入0退出) : ");
scanf( "%d ", &n);

c = 0;

if (n == 0)
break;

while (n != 0 && (n > > 1 < < 1 == n))
{
++c;
n = n > > 1;
}

printf( "后面 0 的个数是 : %d\n ", c);
}


return 0;


}

[解决办法]
#include "stdio.h "


int main()
{
int n = 0;
int i;

while (1)
{
printf( "请输入你要测试的整数(输入0退出) : ");
scanf( "%d ", &n);

i = 0;

if (n == 0)
break;

while((!(n%2))&&(!n%(2 < <i)))
i++;
printf( "后面 0 的个数是 : %d\n ",i);
}
}


//大家看一下我这个怎么样!
[解决办法]
这个样子差不多了!运算也不复杂!

#include <stdio.h>
int main(void)
{
int num[]={2,4,8,16,32,64,128,0},n,len,zl=0;
unsigned char *p,i;
printf( "Please intput a value! ");
scanf( "%d ",&n);
p=(char *)&n;
len=sizeof(int);
while(len--)
{
for(i=8;i> 0;i--)
if((*p|num[i-1])==num[i-1])
break;
if(i!=8)
len=0;
zl+=i;
p++;
}
printf( "zero 's total=%d\n ",zl);
getch();
return 0;
}
[解决办法]
计算一个整数最后有几个0,最快的方法可以用汇编
80386以后就有指令bsf
比如
bsf eax, x
可以计算出变量x中最后一个1的位置,存放在eax中
如果不使用汇编,也可以有不使用循环的方法
比如函数
int count_ones(int x){
x = (x & 0x55555555) + ((x> > 1)&0x55555555);
x = (x & 0x33333333) + ((x> > 2)&0x33333333);
x = (x + (x> > 4)) & 0x0F0F0F0F;
x = x+(x> > 8);
x = (x+(x> > 16))&0xFF;
return x;
}
这个函数可以计算出整数x中比特1的数目
而计算最后以为1的位置,可以采用
count_ones((x^(x-1)) - 1
这个方法比用循环效率好。
还有人研究可以通过开一个buffer,事先存放好一些数据,那种方法性能也不错。

热点排行