C++进制转换
时间: 2025-04-26 07:13:59 浏览: 29
### C++ 进制转换方法及代码示例
#### 使用字符串流 `sstream` 实现进制转换
在 C++ 中,可以利用 `<sstream>` 库中的 `stringstream` 类来方便地完成不同进制之间的转换。此方法适用于将整数转换成其他进制的字符串表示。
```cpp
#include <iostream>
#include <sstream>
int main() {
int decimalNumber;
std::cout << "Enter a decimal number: ";
std::cin >> decimalNumber;
// 转换为二进制
std::ostringstream binStream;
binStream << std::hex << decimalNumber; // 此处应改为 std::bin,在C++17及以上版本支持
std::string binaryString = binStream.str();
// 转换为八进制
std::ostringstream octStream;
octStream << std::oct << decimalNumber;
std::string octalString = octStream.str();
// 转换为十六进制
std::ostringstream hexStream;
hexStream << std::hex << decimalNumber;
std::string hexadecimalString = hexStream.str();
std::cout << "Binary: " << binaryString << "\nOctal: " << octalString
<< "\nHexadecimal: " << hexadecimalString << '\n';
}
```
注意:上述例子中对于二进制输出部分存在错误示范,因为标准库直到 C++17 才引入了对二进制字面量的支持[^1]。
#### 整数类型的直接赋值与打印
另一种简单的方式是通过设置输入输出流的状态标志位来进行进制间的切换:
```cpp
#include <iostream>
int main(){
unsigned long num;
std::cout << "Input an integer (decimal):";
std::cin >> num;
std::cout << "Decimal:" << dec << num <<'\n'
<< "Octal:" << oct << num <<'\n'
<< "Hexadecimal:" << hex << num <<'\n';
}
```
这段代码展示了如何改变控制台输出时使用的基数,而不需要额外创建任何对象或调用函数[^2]。
#### 自定义逻辑实现特定需求下的进制转换
当需要更复杂的处理或是自定义格式化规则时,则可能需要用到手动编写的算法。比如下面的例子是从任意给定的 n 进制到 m 进制的通用转换器的一部分——这里仅展示从较低进制向较高进制转变的情况(如由二进制转至十进制),反之亦然的过程相对复杂一些。
```cpp
#include <cmath>
#include <string>
// 将指定底数 base 的数值 str 解析并返回其对应的十进制值
long parseBase(const std::string& str, const size_t base){
long result = 0L;
for(auto it=str.rbegin();it!=str.rend();++it){
char c=*it;
if(c>='A'&&c<='F') c=c-'A'+10;
else if(c>='a'&&c<='f') c=c-'a'+10;
result += pow(base,(size_t)(it-str.rbegin()))*(c-'0');
}
return result;
}
void toHigherBase(long value,size_t target_base,std::ostream &out){
static constexpr char digits[]="0123456789ABCDEF";
do{
out<<digits[value%target_base];
value /= target_base;
}while(value);
}
int main(){
auto input="1010"; // 假设这是一个二进制串
auto parsedValue=parseBase(input,2); // 把它解析成十进制
std::cout<<"Parsed as Decimal:"<<parsedValue<<"\n";
std::cout<<"Converted back to Binary:";
toHigherBase(parsedValue,2,std::cout);
return 0;
}
```
这种方法允许更加灵活的操作,并且可以根据具体应用场景调整细节[^3]。
#### 处理特殊情况:二进制转十六进制
针对某些特殊场景下效率更高的解决方案也值得注意。例如,由于计算机内部数据是以字节存储的事实,因此可以直接按每四位一组的方式来高效地执行二进制到十六进制的映射。
```cpp
#include <bitset>
#include <iomanip>
#include <iostream>
#include <string>
std::string binaryToHex(const std::string& binaryStr) {
std::string hexStr;
while (!binaryStr.empty()) {
// 补齐不足的部分
std::string chunk = binaryStr.substr(0, 4);
if (chunk.size() < 4) chunk.insert(chunk.begin(), 4 - chunk.size(), '0');
// 计算这部分代表的十进制数
unsigned short val = std::bitset<4>(chunk).to_ulong();
// 添加相应的十六进制字符
hexStr.push_back("0123456789abcdef"[val]);
// 移除已处理过的前缀
binaryStr.erase(binaryStr.begin(), binaryStr.begin()+4);
}
return hexStr;
}
int main() {
std::string binaryData{"1101"};
std::cout << "Original Binary Data: " << binaryData << '\n';
std::string convertedHexString = binaryToHex(binaryData);
std::cout << "Converted Hex String : " << convertedHexString << '\n';
}
```
这个片段演示了一个简单的策略用于快速有效地把短长度的二进制序列转化为易于阅读的形式[^4]。
阅读全文
相关推荐













