C語言的進(jìn)制轉(zhuǎn)換及算法實現(xiàn)教程
1、其他進(jìn)制轉(zhuǎn)十進(jìn)制
1.1、二進(jìn)制轉(zhuǎn)十進(jìn)制
轉(zhuǎn)換規(guī)程: 從最低位開始,將每個位上的數(shù)提取出來,乘以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ī)則: 從最低位開始,將每個位上的數(shù)提取出來,乘以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ī)則: 從最低位開始,將每個位上的數(shù)提取出來,乘以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ù)倒過來,就是對應(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
代碼實現(xiàn):
#include <stdio.h>
//轉(zhuǎn)十進(jìn)制二進(jìn)制
void main() {
printf("請輸入一個十進(jìn)制數(shù):");
int binary = 0; //二進(jìn)制數(shù)
int b = 1; //循環(huán)標(biāo)志
int num[100] ; //用來存二進(jìn)制的數(shù)組
int index = 0; //數(shù)組的下標(biāo)
int count = -1; //用來計算數(shù)組的使用個數(shù),這里使用-1是因為數(shù)組的下標(biāo)是從0開始的
//所以當(dāng)我們循環(huán)一次去自增的時候,第一次應(yīng)該是從0開始,如果count的初始值是0的話
//就會導(dǎo)致使用的第一個數(shù)組的下標(biāo)為1,那樣會導(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ù)組的一個位置
if (binary == 0) {
b = 0;
}
}
printf("占用數(shù)組位置%d個",count+1);
printf("\n");
printf("二進(jìn)制數(shù)為:");
for (int i = count; i >=0; i--) {
printf("%d",num[i]);
}
getchar();
getchar();//回車會被接收,所以需要兩個來暫??刂婆_
}
2.2、十進(jìn)制轉(zhuǎn)八進(jìn)制octonary
規(guī)則: 將該數(shù)不斷除以8,直到商為0,然后將每步得到的余數(shù)倒過來,就是對應(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
代碼實現(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ù)組用來存儲轉(zhuǎn)換后的八進(jìn)制數(shù)
int octonary = 0; //十進(jìn)制數(shù)
int b = TRUE; //循環(huán)賦值的標(biāo)志
int index = 0; //存儲八進(jìn)制位數(shù)的下標(biāo)
int count = -1; //八進(jìn)制數(shù)的位數(shù)
printf("請輸入一個十進(jìn)制數(shù):");
scanf("%d",&octonary);
while (b) {
num[index++] = octonary % 8; //獲取余數(shù)
octonary /= 8; //累除
count++;
if (octonary == 0) { //當(dāng)octonary為0時,表示已經(jīng)除完了,除到底了,這時候只需要將所得到的的余數(shù)
b = FALSE; //倒過來就是需要求的八進(jìn)制數(shù)了
}
}
printf("占用數(shù)組位置%d個\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ù)倒過來,就是對應(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
代碼實現(xiàn):
#include <stdio.h>
#include <stdbool.h>
//十進(jìn)制轉(zhuǎn)換為十六進(jìn)制
void main() {
int hexadecimal = 0;
printf("請輸入一個十進(jìn)制數(shù):");
scanf("%d",&hexadecimal);
bool b = true;
int index = 0;//數(shù)組的下標(biāo)
int num[100];//用來存儲轉(zhuǎn)換后十六進(jìn)制
while (b) {
num[index++] = hexadecimal % 16;
hexadecimal /= 16;
if (hexadecimal == 0) {
b = false;
}
}
printf("占用數(shù)組的位置%d個\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ī)則: 從低位開始,將二進(jìn)制數(shù)每三位一組(111表示7)分組,不夠的用0補(bǔ)充,將每一組轉(zhuǎn)換成對應(yīng)的八進(jìn)制即可
案例: 將11010101轉(zhuǎn)成八進(jìn)制
11010101:對其進(jìn)行三位一體分組
第一組:101 ——> 5
第二組:010 ——> 2
第三組:011 ——> 3
故,二進(jìn)制11010101對應(yīng)的八進(jìn)制數(shù)是:0325
3.2、二進(jìn)制轉(zhuǎn)十六進(jìn)制
規(guī)則: 從低位開始,將二進(jìn)制數(shù)每四位一組(1111表示F)進(jìn)行分組,轉(zhuǎn)成對應(yīng)的十六進(jìn)制數(shù)即可
案例: 將11010101轉(zhuǎn)成十六進(jìn)制
11010101:對其進(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)換成對應(yīng)的一個三位的二進(jìn)制數(shù)即可
案例: 將0237轉(zhuǎn)成二進(jìn)制
0237:每一位對應(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)換成對應(yīng)的一個四位的二進(jìn)制數(shù)即可
案例: 將0X23B轉(zhuǎn)換成二進(jìn)制數(shù)
0x23B:每一位對應(yīng)四位二進(jìn)制數(shù)進(jìn)行拆分
第一組 B ——> 1011
第二組 3 ——> 0011
第三組 2 ——> 0010
故,0x23B轉(zhuǎn)換為二進(jìn)制數(shù)為:1000111011
總結(jié)
到此這篇關(guān)于C語言的進(jìn)制轉(zhuǎn)換及算法實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言進(jìn)制轉(zhuǎn)換及算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)LeetCode(557.翻轉(zhuǎn)字符串中的單詞之三)
這篇文章主要介紹了C++實現(xiàn)LeetCode(557.翻轉(zhuǎn)字符串中的單詞之三),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C++面試題之結(jié)構(gòu)體內(nèi)存對齊計算問題總結(jié)大全
這篇文章主要給大家總結(jié)了關(guān)于C++面試題中結(jié)構(gòu)體內(nèi)存對齊計算問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),通過這些介紹的內(nèi)容對大家在面試C++工作的時候,會有一定的參考幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08

