計算二進位制中1的個數和0的個數
(1)計算一個十進位制數(不一定要十進位制)轉換為二進位制后里面1的個數:
思想如下:
每次將該數與該數減一後的數值相與,從而將最右邊的一位1消掉
直到該數為0
中間迴圈的次數即為其中1的個數
#include<stdio.h>
void main()
{
int count=0;
int input , n;
scanf("%d",&input);
n=input;
while(n)
{
++count; //1的個數
n=(n-1)&n; //每次將該數與該數減一後的數值相與,從而將最右邊的一位1消掉
}
}
//直接用移位一位一位的判斷。
int GetCount(unsigned int num)
{
/*在這裡實現功能*/
int count=0;
while(num>0)
{
if((num&1)==1)
count++;
num=num>>1;
}
return count;
}
(2)計算一個十進位制數(不一定要十進位制)轉換為二進位制后里面0的個數(左邊起第一1前面的0不計算在內):
演算法思路:
先用上面的方法計算1的個數
將輸入的數與1相與,並不斷右移(直到遇到1的個數為上一步求得的一的個數),不斷判斷各位是0或者是1,統計0的個數
#include<stdio.h>
void main()
{
int count=0,count1=0 , count0 = 0;
int input =0,n;
scanf("%d",&input);
n=input;
while(n)
{
++count; //1的個數
n=(n-1)&n; //每次將該數與該數減一後的數值相與,從而將最右邊的一位1消掉
}
while(input)
{
if(input&1==1)
{
count1++;
if(count1==count)
break;
}
else
count0++;
input=input>>1;
}
printf("%d",count0);
}