C語言進制轉換


前言

閑着沒事寫寫玩玩的。

目錄

1.十進制二進制/八進制/十六進制
2.二進制/八進制/十六進制十進制
3.二進制/八進制/十六進制之間的互相轉換

1.十進制轉二進制/八進制/十六進制

1.1.十進制轉二進制

數學上的方法是除以2,倒取余數,例如:

按照從下往上的順序寫,就是1010.

那么代碼上面,只需要一個循環即可:

while(dec){
	bin[k]=dec%2;
	dec/=2;
	k++;
}

注意是倒取余數,因此輸出的時候翻轉一下即可,從k-1到0.

#include<iostream>
#include<stdio.h>

int dec;
int bin[100];
int main(){
	scanf("%d",&dec);
	int k=0;
	while(dec){
		bin[k]=dec%2;
		dec/=2;
		k++;
	}
	for(int i=k-1;i>=0;i--){
		printf("%d",bin[i]);
	}
}

1.2.十進制轉八進制

毫無難度,和之前上面的寫法一樣,只是把2換成8.

#include<iostream>
#include<stdio.h>

int dec;
int oct[100];
int main(){
	scanf("%d",&dec);
	int k=0;
	while(dec){
		oct[k]=dec%8;
		dec/=8;
		k++;
	}
	for(int i=k-1;i>=0;i--){
		printf("%d",oct[i]);
	}
}

1.3.十進制轉十六進制

注意:十六進制中包含數碼ABCDEF,因此輸出時需要經過特殊轉換。方法是在輸出的時候加上一個switch case。

#include<iostream>
#include<stdio.h>

int dec;
int hex[100];
int main(){
	scanf("%d",&dec);
	int k=0;
	while(dec){
		hex[k]=dec%16;
		dec/=16;
		k++;
	}
	for(int i=k-1;i>=0;i--){
		if(hex[i]<=9)printf("%d",hex[i]);
		else{
			switch(hex[i]){
				case 10:putchar('A');break;
				case 11:putchar('B');break;
				case 12:putchar('C');break;
				case 13:putchar('D');break;
				case 14:putchar('E');break;
				case 15:putchar('F');break;
			}
		}
	}
}

2.二進制/八進制/十六進制轉十進制

2.1.二進制轉十進制

二進制的每一位都有對應的權值,類似十進制個位表示1,十位表示10,百位表示100等,二進制第一位表示1,第二位2,第三位4,第四位8,以此類推。

如圖,把每一位權值乘以這一位的數字即可。

注意在寫的時候,語法方面的一些小問題,寫在注釋里面了:

#include<iostream>
#include<stdio.h>
#include<string.h>

int dec;
char bin[100];
int main(){
	fgets(bin,sizeof(bin),stdin);
	//也可用gets(bin)代替,但是gets被標准列為不安全的函數,並且在部分環境會報錯
	int p=1;//權值 
	for(int i=strlen(bin)-2;i>=0;i--){
		//這里從strlen(bin)-2開始,因為fgets會把換行符一起讀入進來,從strlen(bin)-1開始會有問題 
		dec+=p*(bin[i]-'0');
		p*=2;
	}
	printf("%d",dec);
}

2.2.八進制轉十進制

只是把權值從每次乘2到乘8,其他無變化。

#include<iostream>
#include<stdio.h>
#include<string.h>

int dec;
char oct[100];
int main(){
	fgets(oct,sizeof(oct),stdin);
	int p=1;//權值 
	for(int i=strlen(oct)-2;i>=0;i--){
		dec+=p*(oct[i]-'0');
		p*=8;
	}
	printf("%d",dec);
}

2.3.十六進制轉十進制

注意,這里十六進制中有A-F的字母,這里我考慮用到一個辦法,使用ref數組,ref[c]就表示c字符對應的數字,例如ref['A']=10。
代碼如下,最前面預處理了ref數組的值。

#include<iostream>
#include<stdio.h>
#include<string.h>

int dec;
char hex[100];
int ref[255];
int main(){
	for(int i='0';i<='9';i++){
		ref[i]=i-'0';
	}
	for(int i='A';i<='F';i++){
		ref[i]=i-'A'+10;
	}
	fgets(hex,sizeof(hex),stdin);
	int p=1;//權值 
	for(int i=strlen(hex)-2;i>=0;i--){
		dec+=p*ref[hex[i]];
		p*=16;
	}
	printf("%d",dec);
}

3.二進制/八進制/十六進制之間的互相轉換

我們知道,這類進制之間的轉換,可以使用三/四位一段的方法,例如:

就是把0x1234轉二進制的結果。

這里只以十六進制轉二進制為例,我們可以使用數組存儲。

#include<iostream>
#include<stdio.h>
#include<string.h>

char* bin[16]={
	"0000","0001","0010","0011","0100","0101","0110","0111",
	"1000","1001","1010","1011","1100","1101","1110","1111",
};

char hex[100];
int ref[255];
int main(){
	for(int i='0';i<='9';i++){
		ref[i]=i-'0';
	}
	for(int i='A';i<='F';i++){
		ref[i]=i-'A'+10;
	}
	fgets(hex,sizeof(hex),stdin);
	for(int i=0;i<strlen(hex)-1;i++){
		printf("%s",bin[ref[hex[i]]]);
	}
	return 0;
}

全文完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM