C++进制转换的方法
一、十进制转其他进制
1. 十进制转二进制
方法:短除法取余倒序排列
步骤:
- 将十进制数不断除以 2,记录余数
- 将余数倒序排列得到二进制结果
示例代码:
std::string decimalToBinary(int decimal) {
if (decimal == 0) return "0";
std::string binary;
while (decimal > 0) {
binary = (decimal % 2 == 0 ? "0" : "1") + binary;
decimal /= 2;
}
return binary;
}
输入:25
→ 输出:11001
2. 十进制转八进制
方法:短除法取余倒序排列
步骤:
- 将十进制数不断除以 8,记录余数
- 余数倒序排列即为八进制结果
示例代码:
std::string decimalToOctal(int decimal) {
std::string octal;
do {
octal = std::to_string(decimal % 8) + octal;
decimal /= 8;
} while (decimal > 0);
return octal;
}
输入:668
→ 输出:1234
3. 十进制转十六进制
方法:短除法取余并处理字母
步骤:
- 将十进制数不断除以 16,记录余数
- 余数大于 9 时用
A-F
表示
示例代码:
std::string decimalToHex(int decimal) {
std::string hex;
const char digits[] = "0123456789ABCDEF";
do {
hex = digits[decimal % 16] + hex;
decimal /= 16;
} while (decimal > 0);
return hex;
}
输入:735
→ 输出:2DF
二、其他进制转十进制
1. 二进制转十进制
方法:按权展开求和
步骤:
- 从右到左,每位数字乘以 2 的幂次
- 累加所有结果
示例代码:
int binaryToDecimal(const std::string& binary) {
int decimal = 0, base = 1;
for (int i = binary.size() - 1; i >= 0; i--) {
if (binary[i] == '1') decimal += base;
base *= 2;
}
return decimal;
}
输入:11001
→ 输出:25
2. 八进制转十进制
方法:按权展开求和
步骤:
- 每位数字乘以 8 的幂次
示例代码:
int octalToDecimal(const std::string& octal) {
int decimal = 0, power = 1;
for (int i = octal.size() - 1; i >= 0; i--) {
decimal += (octal[i] - '0') * power;
power *= 8;
}
return decimal;
}
输入:1234
→ 输出:668
3. 十六进制转十进制
方法:处理字母后按权展开
步骤:
- 将
A-F
转换为 10-15 - 每位数字乘以 16 的幂次
示例代码:
int hexToDecimal(const std::string& hex) {
int decimal = 0, power = 1;
for (int i = hex.size() - 1; i >= 0; i--) {
char c = toupper(hex[i]);
int val = (c >= 'A') ? (c - 'A' + 10) : (c - '0');
decimal += val * power;
power *= 16;
}
return decimal;
}
输入:2DF
→ 输出:735
三、二进制与其他进制的直接转换
1. 二进制转八进制
方法:三位一组分组转换
步骤:
- 从右向左每 3 位分组,不足补零
- 每组转为十进制后拼接为八进制
示例代码:
std::string binaryToOctal(const std::string& binary) {
std::string padded = std::string(3 - binary.size() % 3, '0') + binary;
std::string octal;
for (size_t i = 0; i < padded.size(); i += 3) {
int group = (padded[i] - '0') * 4 + (padded[i+1] - '0') * 2 + (padded[i+2] - '0');
octal += std::to_string(group);
}
return octal;
}
输入:1101001110
→ 输出:1516
2. 二进制转十六进制
方法:四位一组分组转换
步骤:
- 从右向左每 4 位分组,不足补零
- 每组转为十六进制字符
示例代码:
std::string binaryToHex(const std::string& binary) {
std::string padded = std::string(4 - binary.size() % 4, '0') + binary;
std::string hex;
const char digits[] = "0123456789ABCDEF";
for (size_t i = 0; i < padded.size(); i += 4) {
int group = (padded[i] - '0') * 8 + (padded[i+1] - '0') * 4
+ (padded[i+2] - '0') * 2 + (padded[i+3] - '0');
hex += digits[group];
}
return hex;
}
输入:110110101
→ 输出:1B5
四、其他进制间的间接转换
1. 八进制转十六进制
方法:先转二进制再转十六进制
步骤:
- 将八进制每位转为 3 位二进制
- 按四位分组转为十六进制
示例:
1234
(八进制) →001 010 011 100
(二进制) →29C
(十六进制)
2. 十六进制转八进制
方法:先转二进制再转八进制
步骤:
- 将十六进制每位转为 4 位二进制
- 按三位分组转为八进制
示例:
2DF
(十六进制) →0010 1101 1111
(二进制) →1337
(八进制)
五、通用方法(任意进制转换)
1. 任意进制转十进制
方法:秦九韶算法优化计算
代码示例:
int anyToDecimal(const std::string& num, int base) {
int decimal = 0;
for (char c : num) {
int digit = isdigit(c) ? c - '0' : toupper(c) - 'A' + 10;
decimal = decimal * base + digit;
}
return decimal;
}
输入:1A
(16 进制) → 输出:26
2. 十进制转任意进制
方法:短除法处理余数
代码示例:
std::string decimalToAny(int decimal, int base) {
if (base < 2 || base > 36) return "";
std::string result;
const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
do {
result = digits[decimal % base] + result;
decimal /= base;
} while (decimal > 0);
return result;
}
输入:255
→ 输出:FF
(base=16)
六、特殊处理(带小数)
1. 十进制小数转二进制
方法:整数部分短除法,小数部分乘 2 取整
步骤:
- 整数部分按短除法处理
- 小数部分不断乘 2,取整数位顺序排列
示例:
6.625
→110.101