1. 程式人生 > >二進位制數中返回1的個數的幾種方法

二進位制數中返回1的個數的幾種方法

方法一:採用先模2再除2的方法,例如13模2結果是1,這個1就是二進位制數中最後一個1,再除以2去除這一個位1,以此往復循化,當二進位制數全是零的時候就沒有1了,迴圈結束。但是此方法只適用於正數
int main()
{  
      int num = 13;//1101
	int 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;
}