1. 程式人生 > >C語言 十進位制數轉化為二進位制 八進位制 十六進位制數

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,不需要去考慮其他的位置。注意,該方法加入輸入一個負數,前面某幾位會是。

    上述的程式碼都只適用於整數。