有关统计二进制中1的个数的奇妙代码

来源:互联网 发布:程序员能自学吗 编辑:程序博客网 时间:2024/05/01 14:08

1.原始代码

#include<stdio.h>
int count_one_bits(unsigned int value)
{
int i=0;
while(value!=1 && value!=0 )
{
if(value%2==1)
{
i++;
}
value=value/2;
}
return i;
}
int main()
{
unsigned int a=30;
int b;

//printf("请输入一个数字:");
//scanf("%d",a);
b=count_one_bits(a);
printf("有%d个1",b);
getchar();
    return 0;

}
    在原始代码中,将输入数据定义为unsigned int 类型的,并且在while循环里控制n的取值范围,在此代码里只能处理正整数,无法处理负数。
2.代码优化
#include<stdio.h>

int count_one_bits(n)

{

int i=0;

int count=0;

while(n)                                                                                                                                 

 {

count++;

  n=n&(n-1);

}

/*for(i=0;i<32;i++)

{

if(((n>>i)&1)==1)

{

count++;

}

}*/

return count;

}

int main()

{

int num;

int r;

printf("请输入一个整形数据:");

scanf_s("%d",&num);

r=count_one_bits(num);

printf("有%d个1",r);

return 0;

}
    (1.)使用移位运算符巧妙的处理了原始代码的弊端-不能处理负数,但是这种方法又带来新的问题:在for循环语句里只能控制i的处理位数32位,存在资源浪费。
  (2.)使用逻辑运算符&解决了移位运算符资源浪费的问题,也为人们带来一种新的编写代码的思路:判断二进制数是否为2的倍数。
3.代码升华
#include<stdio.h>
int main()
{
 int num=16;
 printf("请输入一个整形数字:");

 scanf_s("%d",&num);
  if((num &(num-1))==0)
  {
   printf("%d是2的倍数",num);
  }
  else
  {
   printf("%d不是2的倍数",num);
  }
 
 getchar();
 return 0;
}


3 0
原创粉丝点击