将二进制数转换成十进制,一般是从字符串转换成一个整数,按位值乘以权值相累加得到结果。
如:1010=1*2^3+0*2^2+1*2+0 =((((1*2)+0)*2)+1)*2+0
将十进制数转换成二进制数,采用的原理就是辗转除2,逆向输出余数。(windows系统下的itoa函数也是一个不错的选择,但DIY更有意义)
实现方法:
#include
void swap( char *a, char *b )
{
char t=*a;
*a=*b;
*b=t;
}
char *reverse(char *s,int len)
{
char *b=s, *e=s+len-1;
while( b{
swap(b++,e--);
}
return s;
}
char *dec2bin(n)
{
static char str[33];
int i=0;
do {
str[i++]=n%2+'0';
n/=2;
}while( n );
str[i]=0;
return reverse(str,i);
}
int bin2dec(char *s)
{
int i,n=0;
for( i=0;s[i];i++ )
n=n*2+s[i]-'0';
return n;
}
void main()
{
int n=100;
char *p;
p=dec2bin(n);
printf("%d(D)=%s(B)\n", n, p );
n=bin2dec(p);
printf("%s(B)=%d(D)\n", p, n );
}
运行结果:
100(D)=1100100(B)
1100100(B)=100(D)
在计算机中,数字都是以二进制形式保存的,无所谓转换不转换的,输出的时候只要改变输出格式即可
数学理论:
十进制转二进制:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写 就是结果
例如302
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
下面是十进制转二进制的代码
#include
int main(void)
{
int i,m,n;
int cs[20];
int ys[20];
while(scanf("%d",&n)!=EOF)
{
cs[0]=n;
if(cs[0]==0) printf("\n");
else
{
i=0;
while(cs[i]!=0)
{
i++;
cs[i]=cs[i-1]/2;
ys[i]=cs[i-1]%2;
}
m=i;
for(i=m;i>0;i--)
printf("%d",ys[i]);
printf("\n");
}
}
return 0;
}
希望能帮助到你。并且楼上说的改变输出格式是错的,C语言只能通过%d %f %c %o %u %x 来输出,也就是说改变输出格式只能输出十进制数,八进制数和十六进制数。