1. 程式人生 > 其它 >C語言的進位制轉換以及演算法實現

C語言的進位制轉換以及演算法實現

技術標籤:C語言筆記演算法

楔子

2021-1-20,天氣陰,今天感覺亂糟糟的,心態也不好,什麼都提不起興趣來,唉,這疫情什麼時候才能結束啊!!!


1、其他進位制轉十進位制

  • 1.1、二進位制轉十進位制
    轉換規程: 從最低位開始,將每個位上的數提取出來,乘以2的(位數-1)次方,然後求和,例如:
	二進位制 1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 11

  • 1.2、八制轉十進位制
    轉換規則: 從最低位開始,將每個位上的數提取出來,乘以8的(位數-1)次方,然後求和,例如:
	八進位制 0123 = 3*8^0 + 2*8^1 + 1
*8^2 = 3+16+64 = 83
  • 1.3、十六進位制轉十進位制
    轉換規則: 從最低位開始,將每個位上的數提取出來,乘以16的(位數-1)次方,然後求和,例如:
		十六進位制 0x34A = 10*16^0 + 4*16^1 + 3*16^2 = 10+64+768 = 842

2、十進位制轉其他進位制

  • 2.1、十進位制轉二進位制binary
    規則: 將該數不斷除以2,直到商為0為止,然後將每步得到的餘數倒過來,就是對應的二進位制,故此法叫做除商逆序取餘法
    案例: 將56轉換為二進位制
	5656 / 2 = 280
	28 / 2 = 140 
	14 / 2 = 70
	7 / 2
= 31 3 / 2 = 11 1 / 2 = 0156轉換為二進位制的結果是:111000

程式碼實現:

#include <stdio.h>

//轉十進位制二進位制
void main() {
	printf("請輸入一個十進位制數:");
	int binary = 0; //二進位制數
	int b = 1; //迴圈標誌		 
	int num[100] ; //用來存二進位制的陣列
	int index = 0;	//陣列的下標
	int count = -1; //用來計算陣列的使用個數,這裡使用-1是因為陣列的下標是從0開始的
	//所以當我們迴圈一次去自增的時候,第一次應該是從0開始,如果count的初始值是0的話
//就會導致使用的第一個陣列的下標為1,那樣會導致存資料的下標index和記錄使用的下標count不一致 //使資料溢位 scanf("%d",&binary); while (b) { num[index] = binary % 2; //每次運算取餘 binary /= 2; //每次運算二進位制數需要除以2 //printf("num[%d]=%d\n",index,num[index]); index++; //每迴圈一次陣列下標就移一位 count++; //每迴圈一次就表示佔用了陣列的一個位置 if (binary == 0) { b = 0; } } printf("佔用陣列位置%d個",count+1); printf("\n"); printf("二進位制數為:"); for (int i = count; i >=0; i--) { printf("%d",num[i]); } getchar(); getchar();//回車會被接收,所以需要兩個來暫停控制檯 }
  • 2.2、十進位制轉八進位制octonary
    規則: 將該數不斷除以8,直到商為0,然後將每步得到的餘數倒過來,就是對應的八進位制。
    **案例:**將156轉換為八進位制
	156156 / 8 = 194
	19 / 8 = 23
	2 / 8 = 02156轉換為八進位制的結果是:0234

程式碼實現:

#include <stdio.h>
//十進位制轉八進位制
#define TRUE 1 //巨集定義 true為1
#define FALSE 0//巨集定義 false為0
void main() {
	int num[100]; //定義陣列用來儲存轉換後的八進位制數
	int octonary = 0; //十進位制數
	int b = TRUE; //迴圈賦值的標誌
	int index = 0; //儲存八進位制位數的下標
	int count = -1; //八進位制數的位數
	printf("請輸入一個十進位制數:");
	scanf("%d",&octonary);
	while (b) {
		num[index++] = octonary % 8; //獲取餘數
		octonary /= 8; //累除
		count++;
		if (octonary == 0) { //當octonary為0時,表示已經除完了,除到底了,這時候只需要將所得到的的餘數
			b = FALSE;		//倒過來就是需要求的八進位制數了
		}
	}
	printf("佔用陣列位置%d個\n",count+1);
	printf("八進位制數為:");
	for (int i = count; i >= 0; i--) {
		printf("%d",num[i]);
	}

	getchar();
	getchar();

}
  • 2.3、十進位制轉十六進位制HEX(hexadecimal)
    規則: 將該數不斷除以16,直到商為0,然後將每步得到的餘數倒過來,就是對應的十六進位制。
    案例: 將356轉換成十六進位制
	356:
	356 / 16 = 224
	22 / 16 = 16
	1 / 16 = 01356轉換為十六進位制的結果為0x164

程式碼實現:

#include <stdio.h>
#include <stdbool.h>
//十進位制轉換為十六進位制
void main() {
	int hexadecimal = 0;
	printf("請輸入一個十進位制數:");
	scanf("%d",&hexadecimal);
	bool b = true;
	int index = 0;//陣列的下標
	int num[100];//用來儲存轉換後十六進位制
	while (b) {
		num[index++] = hexadecimal % 16;
		hexadecimal /= 16;
		if (hexadecimal == 0) {
			b = false;
		}
	}
	printf("佔用陣列的位置%d個\n",index);
	printf("轉換後的十六進位制數為:");
	for (int i = index-1; i >= 0; i--) {
		printf("%d",num[i]);
	}
	getchar();
	getchar();
}

3、二進位制轉其他進位制

  • 3.1、二進位制轉八進位制
    規則: 從低位開始,將二進位制數每三位一組(111表示7)分組,不夠的用0補充,將每一組轉換成對應的八進位制即可
    案例: 將11010101轉成八進位制
	11010101:對其進行三位一體分組
	第一組:101 ——>  5
	第二組:010 ——>  2
	第三組:011 ——>  3
	故,二進位制11010101對應的八進位制數是:0325
  • 3.2、二進位制轉十六進位制
    規則: 從低位開始,將二進位制數每四位一組(1111表示F)進行分組,轉成對應的十六進位制數即可
    案例: 將11010101轉成十六進位制
	11010101:對其進行四位一體分組
	第一組:0101 ——> 5
	第二組:1101 ——> 13
	故,二進位制11010101轉換為十六進位制數是:0xD5

4、其他進位制轉二進位制

  • 4.1、八進位制轉二進位制
    規則: 將八進位制數的每一位,轉換成對應的一個三位的二進位制數即可
    案例: 將0237轉成二進位制
	0237:每一位對應三位二進位制數進行拆分
	第一組 7 ——> 111
	第二組 3 ——> 011
	第三組 2 ——> 010
	故,八進位制數0237轉換為二進位制為:10011111
  • 4.2、十六進位制轉二進位制
    規則: 將十六進位制數的每一位,轉換成對應的一個四位的二進位制數即可
    案例: 將0X23B轉換成二進位制數
	0x23B:每一位對應四位二進位制數進行拆分
	第一組 B ——> 1011
	第二組 3 ——> 0011
	第三組 2 ——> 0010
	故,0x23B轉換為二進位制數為:1000111011