二進位制數中返回1的個數的幾種方法
阿新 • • 發佈:2018-11-14
方法一:採用先模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;
}