1. 程式人生 > >十進位制轉換二進位制 非遞迴實現

十進位制轉換二進位制 非遞迴實現

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

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;
}