十进制转换二进制 非递归实现

做了个十进制转换成二进制的题,就是容易忽略一些细节。
我写的十进制转换二进制函数代码是这样的

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