做了個十進制轉換成二進制的題,就是容易忽略一些細節。
我寫的十進制轉換二進制函數代碼是這樣的
int fan(int n)
{
int i=0,a[100];
while(n)
{
a[i]=n%2;
i++;
n/=2;
}
while(i--)
printf("%d",a[i]);
}
但是我看了大神的代碼之後,就有點不懂了。
int fan1(int n)
{
int i=0,a[100];
while(n)
{
a[i]=n&1;
i++;
n/=2;
}
while(i--)
printf("%d",a[i]);
}
我當時不懂爲什麼n&1可以替換n%2。之後上網查了查。
首先,a&b表示,a和b在計算機中存儲的對應二進制碼按位取與;
例如:
a的二進制碼爲:0111,b的二進制碼爲:0011時:
0111
& 0011
= 0011
對應十進制形式爲:7&3=3;
同理:因爲1的對應存儲的二進制碼除了最低位,其他位都是0,所以,n&1要麼爲1(n爲奇數時,n的最低位爲1),要麼爲0(n爲偶數時,n的最低位爲0)。
綜上可得:n&1等效於 n%2==1 。
#include <stdio.h>
#include <stdlib.h>
int fan(int n)
{
int i=0,a[100];
while(n)
{
a[i]=n%2;
i++;
n/=2;
}
while(i--)
printf("%d",a[i]);
}
int fan1(int n)
{
int i=0,a[100];
while(n)
{
a[i]=n&1;
i++;
n/=2;
}
while(i--)
printf("%d",a[i]);
}
int main()
{
int n;
scanf("%d",&n);
fan(n);
printf("\n");
fan1(n);
system ("pause");
return 0;
}