c++进制转换
在 C++ 中,进制转换是一个常见的需求,通常涉及将数字从一种进制(如十进制)转换为另一种进制(如二进制、八进制、十六进制)。以下是常用的进制转换模板和示例:
1. 将十进制转换为其他进制
1.1 使用 std::bitset
转换为二进制
std::bitset
可以方便地将整数转换为二进制字符串。
#include <iostream>
#include <bitset>
int main() {
int num = 42;
// 将十进制转换为二进制(8位)
std::bitset<8> binary(num);
std::cout << "Binary: " << binary << std::endl; // 00101010
return 0;
}
1.2 使用 std::ostringstream
转换为任意进制
通过 std::ostringstream
和 std::setbase
可以将整数转换为任意进制(2、8、10、16)。
#include <iostream>
#include <sstream>
#include <iomanip> // std::setbase
int main() {
int num = 42;
// 转换为二进制
std::ostringstream binary;
binary << std::setbase(2) << num;
std::cout << "Binary: " << binary.str() << std::endl; // 101010
// 转换为八进制
std::ostringstream octal;
octal << std::setbase(8) << num;
std::cout << "Octal: " << octal.str() << std::endl; // 52
// 转换为十六进制
std::ostringstream hex;
hex << std::setbase(16) << num;
std::cout << "Hexadecimal: " << hex.str() << std::endl; // 2a
return 0;
}
1.3 手动实现进制转换
通过循环和取模运算,可以手动实现任意进制的转换。
#include <iostream>
#include <string>
#include <algorithm>
std::string decimalToBase(int num, int base) {
if (num == 0) return "0";
std::string result;
while (num > 0) {
int remainder = num % base;
char digit = (remainder < 10) ? ('0' + remainder) : ('A' + remainder - 10);
result.push_back(digit);
num /= base;
}
// 反转字符串
std::reverse(result.begin(), result.end());
return result;
}
int main() {
int num = 42;
std::cout << "Binary: " << decimalToBase(num, 2) << std::endl; // 101010
std::cout << "Octal: " << decimalToBase(num, 8) << std::endl; // 52
std::cout << "Hexadecimal: " << decimalToBase(num, 16) << std::endl; // 2A
return 0;
}
2. 将其他进制转换为十进制
2.1 使用 std::stoi
或 std::stol
std::stoi
和 std::stol
可以将字符串从指定进制转换为十进制。
#include <iostream>
#include <string>
int main() {
std::string binary = "101010";
std::string octal = "52";
std::string hex = "2A";
// 二进制转十进制
int decimal1 = std::stoi(binary, nullptr, 2);
std::cout << "Binary to Decimal: " << decimal1 << std::endl; // 42
// 八进制转十进制
int decimal2 = std::stoi(octal, nullptr, 8);
std::cout << "Octal to Decimal: " << decimal2 << std::endl; // 42
// 十六进制转十进制
int decimal3 = std::stoi(hex, nullptr, 16);
std::cout << "Hexadecimal to Decimal: " << decimal3 << std::endl; // 42
return 0;
}
2.2 手动实现进制转换
通过循环和幂运算,可以手动实现任意进制到十进制的转换。
#include <iostream>
#include <string>
#include <cmath>
int baseToDecimal(const std::string& num, int base) {
int decimal = 0;
for (size_t i = 0; i < num.length(); i++) {
char c = num[i];
int digit = (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10);
decimal = decimal * base + digit;
}
return decimal;
}
int main() {
std::string binary = "101010";
std::string octal = "52";
std::string hex = "2A";
std::cout << "Binary to Decimal: " << baseToDecimal(binary, 2) << std::endl; // 42
std::cout << "Octal to Decimal: " << baseToDecimal(octal, 8) << std::endl; // 42
std::cout << "Hexadecimal to Decimal: " << baseToDecimal(hex, 16) << std::endl; // 42
return 0;
}
3. 任意进制之间的转换
可以通过十进制作为中间桥梁,实现任意进制之间的转换。
#include <iostream>
#include <string>
#include <algorithm>
// 十进制转任意进制
std::string decimalToBase(int num, int base) {
if (num == 0) return "0";
std::string result;
while (num > 0) {
int remainder = num % base;
char digit = (remainder < 10) ? ('0' + remainder) : ('A' + remainder - 10);
result.push_back(digit);
num /= base;
}
std::reverse(result.begin(), result.end());
return result;
}
// 任意进制转十进制
int baseToDecimal(const std::string& num, int base) {
int decimal = 0;
for (size_t i = 0; i < num.length(); i++) {
char c = num[i];
int digit = (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10);
decimal = decimal * base + digit;
}
return decimal;
}
// 任意进制之间的转换
std::string convertBase(const std::string& num, int fromBase, int toBase) {
int decimal = baseToDecimal(num, fromBase);
return decimalToBase(decimal, toBase);
}
int main() {
std::string binary = "101010";
std::string hex = convertBase(binary, 2, 16);
std::cout << "Binary to Hexadecimal: " << hex << std::endl; // 2A
return 0;
}
4. 总结
- 使用
std::bitset
可以快速将整数转换为二进制。 - 使用
std::ostringstream
和std::setbase
可以将整数转换为任意进制。 - 使用
std::stoi
可以将字符串从指定进制转换为十进制。 - 手动实现进制转换可以处理更复杂的需求。