进制转换(c++)

由于进制转换属于基础且比较重要,所以我就写一个博客方便自己复习,过程中如有错误,还请指出。

常用的进制有二进制,八进制,十进制和十六进制。

常用的进制转换就是十进制转换成其他进制和其他进制转换成十进制

我们先来讲其他进制转换成十进制。我们先看个例子,比如有一个十进制数字是666

那我们可以分解为6*10^2 + 6*10^1 + 6*10^0 ,这个分解求和出来的结果是十进制数字的,那么同理,如果有一个二进制数字1011,想转换成十进制数字就可以变成, 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0. 得到的结果是11,那这个11就是1011转换成十进制数的结果.有了这个基础,我们就可以写一段代码来求了

先包含头文件

1.由于得到的是十进制数,所以返回值类型是int

2.由于其他进制可能原本包含字母(比如16进制就包含A,B,C,D,E,F),所以形参用string来接收,base是本来的进制数,比如16进制转换成10进制,base就是16

3.这里的做法是从高位开始取,也就是从s的下标0开始,字符串的左边是高位,右边是低位,为什么这样做呢?因为我们后面可以用动态权值累加的方法,比较方便和容易理解。

4.下面的动态权值累加是核心代码,务必要理解,这里其实可以用分配律来理解

比如有一个16进制数1AB,那么执行下来就是

ans = 0 * 16 + 1          == 1 * 16^0

ans = 1 * 16 + 10        == 1 * 16^1 + 10 * 16^0

ans = 26 * 16 + 11        == (16 + 10) * 16^1 + 11        == 1 * 16^2 + 10 * 16^1 + 11 * 16^0

可以看到,从高位开始乘,如果后面还有位数,那之前乘过的位数上的数字都会乘上一个进制数base,这样子我们就可以模拟出手算的过程了

接下来是十进制转换成其他进制,一般都是用连除法,即这个数每次都除以要转换的进制数,记录下来余数,再将得到的结果继续除,直到得到的结果为0停止,此时记录下来的余数,最开始记的是低位,也就是在最右边,最后面记的是高位,也就是最左边

1.其他进制可能有字母,所以返回值类型是string,要传入的是十进制数和要转换成的进制base

2.while里面的temp是int类型,所以转换成字符型数字要加个字符'0',ans是string类,虽然会隐式转换,但显式转换更直观一点,也可以避免潜在风险

3.最后,由于我们第一次得到的余数记录在string是最左边(高位),但是第一次得到的余数是低位的,所以我们需要逆转一下,最后返回就行

完整代码如下:

#include <iostream>
#include <string>		//用到string函数库的内容 
#include <algorithm>	//reverse()函数头文件 
using namespace std;


int charToValue(char c)
{
	if (c >= '0' && c <= '9') {
		return c - '0';
	}
	else if (c >= 'a' && c <= 'z') {
		return 10 + c - 'a';
	}
	else if (c >= 'A' && c <= 'Z') {
		return 10 + c - 'A';
	}
	cout << "Your char error" << endl;
}



int changeToDecimal(string s, int base) //s是传进来要修改的数值,base是原本的进制数 
{
	int ans = 0;
	for (int i = 0; i < s.size(); i++) {	//从高位开始取 
		int value = charToValue(s[i]);	//将字符转换成对应数字 
		if (value > base) {	 //数字超过进制数,代表这段数值是不合理的 
			cout << "Your value beyond range" << endl;
			return -1;
		}
		//从最左端(最高位)开始算起,每经过下一位,这个位置都会乘上权值(比如16进制就是16)
		//所以假设有n位,那么我们这个算法乘下来从左到右就是乘了   k^n-1,  k^n-2,  k^n-3,   .....  k^0
		ans = ans * base + value;	//动态权值累加
	}
	return ans;
}


//十进制转换为其他进制
string decimalToOther(int decimal, int base) //十进制数,要转换的进制
{
	if (decimal == 0) return "0";	//做一个特判,为0直接返回字符串 
	string ans = "";
	while (decimal != 0)	//连除法 
	{
		int temp = decimal % base;	//模拟手算的求余过程 
		//转换成字符 
		if (temp >= 0 && temp <= 9) {
			ans += (char)('0' + temp);
		}
		else if (temp > 9){
			ans += (char)(temp + 'A' - 10);
		}
		decimal /= base;	//舍掉末尾 
	}
	reverse(ans.begin(), ans.end());	//逆序函数,第一个参数是元素的首地址,第二个参数是要结束的位置的下一位 
	return ans;
}


void testjinzhi()
{
	string s;
	int base;
	//base进制转换为10进制
	cin >> s >> k;
	cout << "其他进制转换为10进制: " << changeToDecimal(s, base) << endl;
	cout << "10进制转换为其他进制: " << decimalToOther(666, base) << endl;


}

int main()
{
	testjinzhi();
	return 0;
}

讲的不是很好,有问题可以评论区交流一下,或者可以看看别人的教程,或许更容易懂

### C++ 中的进制转换方法 #### 使用字符串流 `stringstream` 实现进制转换C++ 中可以利用 `<sstream>` 库中的 `stringstream` 来方便地完成不同进制之间的转换。下面是个简单的例子展示如何将二进制字符串转化为十进制数值[^1]。 ```cpp #include <iostream> #include <sstream> int binary_to_decimal(const std::string& binStr) { std::stringstream ss; int decimalValue = 0; // 将输入的二进制字符串放入 stringstream 并指定基数为2 ss << std::hex; // 如果是十六进制则应改为 hex ss << binStr; // 解析并得到对应的十进制值 ss >> decimalValue; return decimalValue; } int main() { std::string inputBinary = "1010"; // 假设这是要转化成十进制的二进制数 int result = binary_to_decimal(inputBinary); std::cout << "The decimal value is: " << result << "\n"; } ``` 需要注意的是上述代码片段中对于二进制到十进制的转换存在错误示范,实际操作时应当移除设置为十六进制的部分(`ss << std::hex`)以确保正确解析二进制字符串。 #### 手动计算法实现二进制转十进制种方式就是通过手动遍历每位来进行加权求和从而获得最终的结果。这里给出段具体的实现代码来说明这过程[^2]: ```cpp #include <iostream> using namespace std; int main(){ string a; cin>>a;// 输入二进制数 int ans=0, jz=1, len=a.length(); for(int i=len-1;i>=0;i--){// 核心代码 ans += (a[i]-'0')*jz; jz *= 2; } cout<<ans;// 转换成的十进制数 return 0; } ``` 此段代码展示了从右向左逐位处理的方式,并且每次迭代都将权重翻倍直到所有位都被考虑进去为止。 #### 多种格式间的相互转换 除了基本类型的进制互换外,在某些应用场景下可能还需要支持更多样化的编码形式比如带符号表示等。有开发者分享了个较为全面的支持多种编码间互相转变的小工具[^3]: 这类程序通常会提供组专门用于执行特定类型变换的操作接口,允许用户轻松地在这几种常见表达之间切换而无需担心底层细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值