最简单理解进制转换

elunking / 2023-07-22 / 原文

转换十进制

对于十进制123我们可以表示成为\(3*10^0+2*10^1+1*10^2\),而同样对于2进制转换称为10进制可以用相同的方法,即将进制基数从最低位开始从0次方开始与其该位的数字相乘
例如:
二进制1110转换十进制,进制基数就是2,从最低位\(2^0\)开始计算:

\[0*2^0 + 1*2^1 + 1 * 2 ^2 + 1*2^3 = 14 \]

对于其他进制转换为十进制其方法时一样的,将进制基数从最低位0次方开始每次乘以该位上的数然后相加。

int base = 1; //进制基数初始化为1,应为最低位0次方等于1
int num = 1110; //需要转换为十进制的数
int result = 0; //保留结果
int baseNum = 2;  //进制基数
while(num != 0){
	result = result + num%10 * base;  //对10取余是为了取到当前num的最低位
	num = num /10; //将已经计算了的最低位去除
	base  = base * baseNum  //进制位的平方进一;
}
printf("%d",result);

十进制转换到二进制

十进制转换到二进制我们一般用除位取余法,即将十进制数每次都除以需要转换的进制基数,保留每次的余数,然后将商继续除位取余,直到商为0;
例如将十进制数11转换为二进制数:
11除以2,得商为5,余数为1:
5除以2,得商为2,余数为1:
2除以2,得商为1,余数为0:
1除以2,得商为0,余数为1,算法终止。
将余数从后往前输出,得1011即为11的二进制数。

int num = 14; //需要转换的十进制数
int save[100001] = {-1}; //用一个数组来保存转换后的结果
int baseNum = 2; //进制基数
int counter = 0;
while(num != 0){
	save[counter++] = num%baseNum;  //保存当前余数
	num = num/baseNum; //去除最低位
}
//将结果数组逆向打印
for(int i = counter-1; i >=0; i--){
	printf("%d",save[i]);
}

进制转换到进制

我们可以得到一个简单的思想,对于将任意进制转换到任意进制,我们只需要将该进制转换为10进制,然后再用除位取余将该10进制转换为指定进制即可。

#include<stdio.h>
#include<iostream>
using namespace std;
class Solution{
    public:
    /*
    baseNum: 需要转换的进制数
    base: 需要转换的进制数的进制
    converBase: 需要转换到几进制
    */
    void bastToBase(int baseNum,int base,int converBase){
        
        int sumFirstBase = 0;  //用来存储baseNum转换到十进制的数
        int product = 1;  //用来提高BaseNum每次末尾的进制位
        while(baseNum != 0){  //循环,每次都抹掉最低位,直到为0
        sumFirstBase+=(baseNum%10)*product;  //每次等于sumFirstBase自身加上当前baseNum最低位乘以单前的进制位
        baseNum/=10; //抹掉最低位
        product*=base; //提高一次进制位
        }
        int result[10000] = {-1};  // 用一个数组来存储这个转换结果
        int num = 0;
        do{
            result[num++] = sumFirstBase%converBase;  //将sumFirstBase对需要转换的进制取余,得到的余数存进数组
            sumFirstBase/=converBase; //将取过一次余的最低位抹掉
        }while(sumFirstBase!=0); 
        //反向打印数组,得到该转换结果
        for(int i = (num-1);i >=0;i--){
            printf("%d",result[i]);
        }
    }
};
int main(){
    Solution solution;
    solution.bastToBase(1103,8,2);
    printf("\n");
}