C语言 十进制数转化为二进制 八进制 十六进制数

    对于刚开始学习C语言的来说,我们知道%d可以表示十进制的数,%o可以表示八进制的数,%x用来表示十六进制的数,但却没有来表示二进制数的。

    这就是相对应的八进制数和十六进制数

 
 
#include <stdio.h>
int main()
{
	int n;
	printf("请输入一个十进制的整数:\n");
	scanf("%d",&n);
	printf("八进制数为:%o\n",n);
	printf("十六进制数为:%x\n",n); 
	return 0;
} 


    那么如何输入一个相对应的二进制数尼?我们知道,对于一个二进制数,只有0和1;一个十进制数转化为二进制数,就是不断模2,并且最后将模2的结果逆序输出。

    下面的代码比较容易理解,但特别的繁琐。

 
 
#include <stdio.h>
#define Maxsize 100
int main()
{
	int n=0,count=0,j=0;
	int a[Maxsize],b[Maxsize];
	printf("请输入一个十进制整数:\n");
	scanf("%d",&n);
	if(n>=0){
		while(n!=0){
			a[count]=n%2;
			n=n/2;
			count++;
		}
		for(int i=count-1;i>=0;i--)//将数组逆序输出 
		printf("%d",a[i]);
	}
	else{
		n=-n;
		while(n!=0){
			a[count]=n%2;
			n=n/2;
			count++;
		}
		for(int i=count-1;i>=0;i--){//将逆序输出的结果保存在另一个数组中 
			b[j]=a[i];
			j++;
		}
		for(int i=0;i<count;i++){   //取反码 
			if(b[i]==0)
				b[i]=1;
			else
				b[i]=0;
		}
		for(int i=count-1;i>=0;i--){  //将反码加1 
			if(b[i]==0){
				b[i]=1;
				break;
			}		
			else{
				b[i]=0;
			}
		}
		for(int i=0;i<count;i++)
		printf("%d",b[i]);
	}
	printf("\n");
	return 0;
}


下面的代码比较简单,但不太容易理解。
 
 
#include <stdio.h>
int main()
{
	int n;
	printf("请输入一个十进制数:\n");
	scanf("%d", &n);
	unsigned int i = 1u << 15;
	for ( ; i ; i >>= 1) {
		printf("%d",n&i?1:0);
	}
	printf("\n");
	return 0;
}


    上述代码用的是移位,用这个方法,代码中的i必须用unsigned int 无符号整型来表示,初始化i=1,后面的u表示的就是unsigned,<<15表示向左移位15个bit(本代码输出的是十六位的二进制数,如果想输出32位的二进制数,只需将15变为31即可),将0000000000000001中的1向左移位15就得到了1000000000000000,接下来就是for循环,就是单纯的让1慢慢向后移一位,例如第二次循环就变为了0100000000000000,同理下去。&表示的是按位与运算符。

    举一个简单的例子,八位的二进制数,假设i循环为了00100000,而算求的二进制数为xx1xxxxx,我们只看与i 中的1相对应位置的数字,假设为0,则最后结果二进制数的该位就是0,若为1,最后结果二进制数的该位就为1,不需要去考虑其他的位置。注意,该方法加入输入一个负数,前面某几位会是。

    上述的代码都只适用于整数。

猜你喜欢

转载自blog.csdn.net/aixiaodeshushu/article/details/80070640