十進位制轉換二進位制 非遞迴實現
阿新 • • 發佈:2019-01-04
做了個十進位制轉換成二進位制的題,就是容易忽略一些細節。
我寫的十進位制轉換二進位制函式程式碼是這樣的
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; }