溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用C語(yǔ)言怎么實(shí)現(xiàn)一個(gè)進(jìn)制轉(zhuǎn)換算法

發(fā)布時(shí)間:2021-01-25 16:02:51 來(lái)源:億速云 閱讀:175 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

使用C語(yǔ)言怎么實(shí)現(xiàn)一個(gè)進(jìn)制轉(zhuǎn)換算法?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

1、其他進(jìn)制轉(zhuǎn)十進(jìn)制

1.1、二進(jìn)制轉(zhuǎn)十進(jìn)制

轉(zhuǎn)換規(guī)程: 從最低位開(kāi)始,將每個(gè)位上的數(shù)提取出來(lái),乘以2的(位數(shù)-1)次方,然后求和,例如: 

二進(jìn)制 1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 11

1.2、八制轉(zhuǎn)十進(jìn)制

轉(zhuǎn)換規(guī)則: 從最低位開(kāi)始,將每個(gè)位上的數(shù)提取出來(lái),乘以8的(位數(shù)-1)次方,然后求和,例如:

 八進(jìn)制 0123 = 3*8^0 + 2*8^1 + 1*8^2 = 3+16+64 = 83

1.3、十六進(jìn)制轉(zhuǎn)十進(jìn)制

轉(zhuǎn)換規(guī)則: 從最低位開(kāi)始,將每個(gè)位上的數(shù)提取出來(lái),乘以16的(位數(shù)-1)次方,然后求和,例如:

  十六進(jìn)制 0x34A = 10*16^0 + 4*16^1 + 3*16^2 = 10+64+768 = 842

2、十進(jìn)制轉(zhuǎn)其他進(jìn)制

2.1、十進(jìn)制轉(zhuǎn)二進(jìn)制binary

規(guī)則: 將該數(shù)不斷除以2,直到商為0為止,然后將每步得到的余數(shù)倒過(guò)來(lái),就是對(duì)應(yīng)的二進(jìn)制,故此法叫做除商逆序取余法;

案例: 將56轉(zhuǎn)換為二進(jìn)制

 56 :
 56 / 2 = 28 余0
 28 / 2 = 14 余0
 14 / 2 = 7 余0
 7 / 2 = 3 余1
 3 / 2 = 1 余1
 1 / 2 = 0余 1
 故56轉(zhuǎn)換為二進(jìn)制的結(jié)果是:111000

代碼實(shí)現(xiàn):

#include <stdio.h>

//轉(zhuǎn)十進(jìn)制二進(jìn)制
void main() {
	printf("請(qǐng)輸入一個(gè)十進(jìn)制數(shù):");
	int binary = 0; //二進(jìn)制數(shù)
	int b = 1; //循環(huán)標(biāo)志		 
	int num[100] ; //用來(lái)存二進(jìn)制的數(shù)組
	int index = 0;	//數(shù)組的下標(biāo)
	int count = -1; //用來(lái)計(jì)算數(shù)組的使用個(gè)數(shù),這里使用-1是因?yàn)閿?shù)組的下標(biāo)是從0開(kāi)始的
	//所以當(dāng)我們循環(huán)一次去自增的時(shí)候,第一次應(yīng)該是從0開(kāi)始,如果count的初始值是0的話
	//就會(huì)導(dǎo)致使用的第一個(gè)數(shù)組的下標(biāo)為1,那樣會(huì)導(dǎo)致存數(shù)據(jù)的下標(biāo)index和記錄使用的下標(biāo)count不一致
	//使數(shù)據(jù)溢出
	scanf("%d",&binary);
	while (b) {
		num[index] = binary % 2; //每次運(yùn)算取余
		binary /= 2; //每次運(yùn)算二進(jìn)制數(shù)需要除以2
		//printf("num[%d]=%d\n",index,num[index]);
		index++; //每循環(huán)一次數(shù)組下標(biāo)就移一位
		count++; //每循環(huán)一次就表示占用了數(shù)組的一個(gè)位置
		if (binary == 0) {
			b = 0;
		}
	}
	printf("占用數(shù)組位置%d個(gè)",count+1);
	printf("\n");
	printf("二進(jìn)制數(shù)為:");
	for (int i = count; i >=0; i--) { 
			printf("%d",num[i]);
	}
	getchar();
	getchar();//回車(chē)會(huì)被接收,所以需要兩個(gè)來(lái)暫??刂婆_(tái)
}

2.2、十進(jìn)制轉(zhuǎn)八進(jìn)制octonary

規(guī)則: 將該數(shù)不斷除以8,直到商為0,然后將每步得到的余數(shù)倒過(guò)來(lái),就是對(duì)應(yīng)的八進(jìn)制。

**案例:**將156轉(zhuǎn)換為八進(jìn)制

 156:
 156 / 8 = 19 余 4
 19 / 8 = 2 余 3
 2 / 8 = 0 余 2
 故156轉(zhuǎn)換為八進(jìn)制的結(jié)果是:0234

代碼實(shí)現(xiàn):

#include <stdio.h>
//十進(jìn)制轉(zhuǎn)八進(jìn)制
#define TRUE 1 //宏定義 true為1
#define FALSE 0//宏定義 false為0
void main() {
	int num[100]; //定義數(shù)組用來(lái)存儲(chǔ)轉(zhuǎn)換后的八進(jìn)制數(shù)
	int octonary = 0; //十進(jìn)制數(shù)
	int b = TRUE; //循環(huán)賦值的標(biāo)志
	int index = 0; //存儲(chǔ)八進(jìn)制位數(shù)的下標(biāo)
	int count = -1; //八進(jìn)制數(shù)的位數(shù)
	printf("請(qǐng)輸入一個(gè)十進(jìn)制數(shù):");
	scanf("%d",&octonary);
	while (b) {
		num[index++] = octonary % 8; //獲取余數(shù)
		octonary /= 8; //累除
		count++;
		if (octonary == 0) { //當(dāng)octonary為0時(shí),表示已經(jīng)除完了,除到底了,這時(shí)候只需要將所得到的的余數(shù)
			b = FALSE;		//倒過(guò)來(lái)就是需要求的八進(jìn)制數(shù)了
		}
	}
	printf("占用數(shù)組位置%d個(gè)\n",count+1);
	printf("八進(jìn)制數(shù)為:");
	for (int i = count; i >= 0; i--) {
		printf("%d",num[i]);
	}

	getchar();
	getchar();

}

2.3、十進(jìn)制轉(zhuǎn)十六進(jìn)制HEX(hexadecimal)

規(guī)則: 將該數(shù)不斷除以16,直到商為0,然后將每步得到的余數(shù)倒過(guò)來(lái),就是對(duì)應(yīng)的十六進(jìn)制。

案例: 將356轉(zhuǎn)換成十六進(jìn)制

 356:
 356 / 16 = 22 余 4
 22 / 16 = 1 余 6
 1 / 16 = 0 余 1
 故356轉(zhuǎn)換為十六進(jìn)制的結(jié)果為0x164

代碼實(shí)現(xiàn):

#include <stdio.h>
#include <stdbool.h>
//十進(jìn)制轉(zhuǎn)換為十六進(jìn)制
void main() {
	int hexadecimal = 0;
	printf("請(qǐng)輸入一個(gè)十進(jìn)制數(shù):");
	scanf("%d",&hexadecimal);
	bool b = true;
	int index = 0;//數(shù)組的下標(biāo)
	int num[100];//用來(lái)存儲(chǔ)轉(zhuǎn)換后十六進(jìn)制
	while (b) {
		num[index++] = hexadecimal % 16;
		hexadecimal /= 16;
		if (hexadecimal == 0) {
			b = false;
		}
	}
	printf("占用數(shù)組的位置%d個(gè)\n",index);
	printf("轉(zhuǎn)換后的十六進(jìn)制數(shù)為:");
	for (int i = index-1; i >= 0; i--) {
		printf("%d",num[i]);
	}
	getchar();
	getchar();
}

3、二進(jìn)制轉(zhuǎn)其他進(jìn)制

3.1、二進(jìn)制轉(zhuǎn)八進(jìn)制

規(guī)則: 從低位開(kāi)始,將二進(jìn)制數(shù)每三位一組(111表示7)分組,不夠的用0補(bǔ)充,將每一組轉(zhuǎn)換成對(duì)應(yīng)的八進(jìn)制即可

案例: 將11010101轉(zhuǎn)成八進(jìn)制

 11010101:對(duì)其進(jìn)行三位一體分組
 第一組:101 ——>  5
 第二組:010 ——>  2
 第三組:011 ——>  3
 故,二進(jìn)制11010101對(duì)應(yīng)的八進(jìn)制數(shù)是:0325

3.2、二進(jìn)制轉(zhuǎn)十六進(jìn)制

規(guī)則: 從低位開(kāi)始,將二進(jìn)制數(shù)每四位一組(1111表示F)進(jìn)行分組,轉(zhuǎn)成對(duì)應(yīng)的十六進(jìn)制數(shù)即可

案例: 將11010101轉(zhuǎn)成十六進(jìn)制

 11010101:對(duì)其進(jìn)行四位一體分組
 第一組:0101 ——> 5
 第二組:1101 ——> 13
 故,二進(jìn)制11010101轉(zhuǎn)換為十六進(jìn)制數(shù)是:0xD5

4、其他進(jìn)制轉(zhuǎn)二進(jìn)制

4.1、八進(jìn)制轉(zhuǎn)二進(jìn)制

規(guī)則: 將八進(jìn)制數(shù)的每一位,轉(zhuǎn)換成對(duì)應(yīng)的一個(gè)三位的二進(jìn)制數(shù)即可

案例: 將0237轉(zhuǎn)成二進(jìn)制

 0237:每一位對(duì)應(yīng)三位二進(jìn)制數(shù)進(jìn)行拆分
 第一組 7 ——> 111
 第二組 3 ——> 011
 第三組 2 ——> 010
 故,八進(jìn)制數(shù)0237轉(zhuǎn)換為二進(jìn)制為:10011111

4.2、十六進(jìn)制轉(zhuǎn)二進(jìn)制

規(guī)則: 將十六進(jìn)制數(shù)的每一位,轉(zhuǎn)換成對(duì)應(yīng)的一個(gè)四位的二進(jìn)制數(shù)即可

案例: 將0X23B轉(zhuǎn)換成二進(jìn)制數(shù)

 0x23B:每一位對(duì)應(yīng)四位二進(jìn)制數(shù)進(jìn)行拆分
 第一組 B ——> 1011
 第二組 3 ——> 0011
 第三組 2 ——> 0010
 故,0x23B轉(zhuǎn)換為二進(jìn)制數(shù)為:1000111011

看完上述內(nèi)容,你們掌握使用C語(yǔ)言怎么實(shí)現(xiàn)一個(gè)進(jìn)制轉(zhuǎn)換算法的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI