十進制轉換二進制 非遞歸實現

做了個十進制轉換成二進制的題,就是容易忽略一些細節。
我寫的十進制轉換二進制函數代碼是這樣的

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章