C++进制转换全攻略,【算法】小点:List.remove。
·
C++中的进制转换方法
进制转换在编程中是一项常见任务,尤其在处理不同数据表示形式时尤为重要。C++提供了多种方法实现进制转换,包括标准库函数、字符串流操作以及手动算法实现。
使用标准库函数进行转换
C++标准库中的<cstdlib>提供了strtol、strtoul等函数用于字符串到整数的转换。这些函数允许指定进制基数。
#include <cstdlib>
#include <iostream>
int main() {
const char* hexStr = "1A";
long num = strtol(hexStr, nullptr, 16);
std::cout << "Hexadecimal to decimal: " << num << std::endl;
}
std::stoi系列函数同样支持进制参数:
std::string octStr = "12";
int octNum = std::stoi(octStr, nullptr, 8);
使用字符串流进行格式化
<sstream>头文件中的字符串流可以方便地进行进制转换和格式化输出:
#include <sstream>
#include <iomanip>
std::ostringstream oss;
oss << std::hex << 255; // 十进制转十六进制
std::string hexStr = oss.str();
对于输入转换:
std::istringstream iss("FF");
int value;
iss >> std::hex >> value;
手动实现转换算法
对于教学目的或特殊需求,可以手动实现转换算法。十进制转其他进制的典型实现:
std::string decimalToBase(int num, int base) {
if(num == 0) return "0";
const char digits[] = "0123456789ABCDEF";
std::string result;
bool isNegative = num < 0;
if(isNegative) num = -num;
while(num > 0) {
result = digits[num % base] + result;
num /= base;
}
return isNegative ? "-" + result : result;
}
其他进制转十进制:
int baseToDecimal(const std::string& numStr, int base) {
int result = 0;
for(char c : numStr) {
int digit = isdigit(c) ? c - '0' : toupper(c) - 'A' + 10;
result = result * base + digit;
}
return result;
}
处理浮点数进制转换
浮点数的进制转换更为复杂,通常涉及IEEE 754标准的位表示。可以通过联合体或类型双关实现:
union FloatConverter {
float f;
uint32_t i;
};
void printFloatBits(float num) {
FloatConverter converter;
converter.f = num;
std::bitset<32> bits(converter.i);
std::cout << bits << std::endl;
}
C++17的std::from_chars和std::to_chars
C++17引入的更高效转换方法:
#include <charconv>
const char* str = "1234";
int value;
std::from_chars(str, str + strlen(str), value, 16); // 十六进制转十进制
char buffer[10];
std::to_chars(buffer, buffer + sizeof(buffer), 255, 16);
注意事项
- 进行进制转换时需考虑数值范围,防止溢出
- 字符串到数字的转换应包含错误检查
- 自定义算法需处理负数和边界情况
- 浮点数转换涉及精度问题,需要特别处理
性能考虑
对于高频转换需求:
std::from_chars/to_chars是无异常的最快选择- 字符串流方法更灵活但性能较低
- 自定义算法可针对特定场景优化
进制转换的选择应基于具体需求,平衡开发效率、运行性能和代码可维护性。
更多推荐


所有评论(0)