C++ 二进制与十进制的转换
时间: 2025-03-09 17:07:04 浏览: 96
<think>好的,用户想了解如何在C++中实现二进制和十进制的互相转换。首先,我需要回忆相关的转换方法。二进制转十进制通常是从右到左每一位乘以2的幂次再求和,而十进制转二进制则是不断除以2并记录余数,然后逆序排列。
接下来,我需要确保代码示例的正确性。对于二进制转十进制,可能需要处理字符串输入,遍历每一位字符,计算对应的数值。需要注意的是,输入的二进制数可能带有前缀如“0b”,或者直接是数字字符串,代码里应该处理这些情况。比如,用户输入的是字符串"1010",那么从高位到低位依次计算,但转换时可能需要从左到右或从右到左处理,这里要确认循环的方向是否正确。
十进制转二进制的话,通常使用除以2取余的方法,然后将余数逆序排列。不过,当处理负数时,可能需要考虑补码,但用户的问题可能只涉及正整数。因此,代码示例中可以假设输入的是正整数,或者添加对负数的处理,但可能用户只需要基础部分,所以暂时忽略负数的情况,保持示例简单。
然后,参考用户提供的引用内容。引用[1]提到二进制转十进制是从右往左乘以二进制数并求和,这与我的理解一致。引用[2]中的代码示例展示了十进制转二进制的函数,使用除以2的方法,但代码可能不完整,比如convert_10_to_2函数的实现细节。用户提供的引用可能有帮助,但需要结合标准的实现方法。
接下来,生成具体的代码。二进制转十进制部分,例如输入字符串"1010",应该转换为10。代码中需要遍历每一位字符,检查是否为'0'或'1',同时计算对应的值。可能还需要处理不同长度的二进制字符串,以及可能的错误输入,但为了简单,可能暂时不处理异常,只给出正确输入的转换。
十进制转二进制部分,使用循环除以2,记录余数,最后逆序。例如,十进制数10转为二进制1010。需要注意的是,当输入为0时,应直接返回"0"。此外,可以使用栈或者字符串的反转来实现逆序排列。
现在,编写代码示例。二进制转十进制函数可能如下:从字符串的最高位(左端)开始,每一位乘以2的相应幂次,例如"1010"的长度是4,循环变量i从0到3,对应的位数是3-i,因此每一位的权重是2^(位数)。或者,也可以从右到左处理,即i从字符串长度-1到0,对应的幂次从0开始增加。这两种方式都可行,但需要确保正确计算。
对于十进制转二进制,使用循环除以2,直到商为0,将余数存入数组或字符串,然后反转得到结果。例如,处理10的时候,余数依次是0,1,0,1,反转后得到1010。
最后,测试代码的正确性,并确保示例清晰易懂。用户可能需要完整的可编译代码,所以主函数部分需要包含输入输出,处理用户输入的数字或字符串,并调用相应的转换函数。
总结步骤:先解释转换原理,然后给出代码示例,并解释关键部分。确保代码符合C++标准,使用基本的输入输出和字符串处理,不使用复杂库函数,方便用户理解。</think>### C++实现二进制与十进制相互转换的方法教程
#### 一、二进制转十进制
**原理**:从二进制数的最低位(右端)开始,每一位乘以$2$的幂次后求和。例如:$1010_2 = 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 = 10_{10}$[^1]。
**代码实现**:
```cpp
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int binary_to_decimal(string binary) {
int decimal = 0;
int len = binary.length();
for (int i = 0; i < len; i++) {
if (binary[i] == '1') {
decimal += pow(2, len - 1 - i); // 从左到右计算权重
} else if (binary[i] != '0') {
cerr << "非法二进制字符: " << binary[i] << endl;
return -1;
}
}
return decimal;
}
int main() {
string bin_str;
cout << "输入二进制数: ";
cin >> bin_str;
int result = binary_to_decimal(bin_str);
if (result != -1) {
cout << "十进制结果: " << result << endl;
}
return 0;
}
```
#### 二、十进制转二进制
**原理**:通过不断除以$2$并记录余数,最后将余数逆序排列。例如:$10_{10} \rightarrow 10/2=5余0 \rightarrow 5/2=2余1 \rightarrow 2/2=1余0 \rightarrow 1/2=0余1 \rightarrow 结果为1010_2$[^2]。
**代码实现**:
```cpp
#include <iostream>
#include <string>
#include <algorithm> // 用于reverse函数
using namespace std;
string decimal_to_binary(int decimal) {
if (decimal == 0) return "0"; // 处理0的特殊情况
string binary;
while (decimal > 0) {
binary += (decimal % 2 == 0) ? '0' : '1';
decimal /= 2;
}
reverse(binary.begin(), binary.end()); // 反转余数序列
return binary;
}
int main() {
int num;
cout << "输入十进制数: ";
cin >> num;
string result = decimal_to_binary(num);
cout << "二进制结果: " << result << endl;
return 0;
}
```
#### 关键点说明
1. **输入验证**:二进制转换需检查字符串是否仅含`0`或`1`。
2. **逆序处理**:十进制转二进制时,余数需逆序排列。
3. **边界条件**:十进制输入为0时直接返回`"0"`。
阅读全文
相关推荐















