二进制数中返回1的个数的几种方法

来源:互联网 发布:数据存储安全 编辑:程序博客网 时间:2024/06/07 18:56
方法一:采用先模2再除2的方法,例如13模2结果是1,这个1就是二进制数中最后一个1,再除以2去除这一个位1,以此往复循化,当二进制数全是零的时候就没有1了,循环结束。但是此方法只适用于正数
int main(){  
      int num = 13;//1101int count = 0;while (num!=0)//二进制数全是零的时候就没有1了{if (num % 2 == 1)count++;num = num / 2;} printf("count=%d\n", count);
}方法二:每次按位与1得到二进制数最右边的一位,再按位移1。例如13,按位与1最右边一位是1,再按位移一,让最后一位的前一位来到最低位,再按位与1,以此循环。
       缺点:不管这个数二进制序列有几个1都会循环32次,效率会差一点。
int main(){int num = 13;int count = 0; int i = 0;for (i = 0; i < 32; i++){if ((num >> i) & 1 == 1)count++; 
       }
      printf("count=%d\n", count);
}

方法三:跟方法二思想一样,就是代码循环有些差别。
int main(){int num = 13;int count = 0;      while(num!=0) {if ((num & 1) == 1)count++;num = num >> 1;//按位与再右移一位} printf("count=%d\n", count);
}
方法四:num=num&(num-1),每执行一次就可以去掉num二进制序列中最右边的1.
       优点:有几个1循环几次,效率高,平均时间复杂度高。
#include<stdio.h>#include<Windows.h>int main(){         int num = 13; int count = 0; while (num) { num = num&(num - 1);//去掉num二进制中最右边的1 //1101 num //1100 //1100 num count++; }//有几个1循环几次,时间效率高 printf("count=%d\n", count);system("pause");return 0;}