欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-08 14:56:57
...

    对于刚开始学习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,不需要去考虑其他的位置。注意,该方法加入输入一个负数,前面某几位会是。

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