C語言 十進位制數轉化為二進位制 八進位制 十六進位制數
阿新 • • 發佈:2019-01-09
對於剛開始學習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,不需要去考慮其他的位置。注意,該方法加入輸入一個負數,前面某幾位會是。
上述的程式碼都只適用於整數。