找回密码
 中文实名注册
搜索
查看: 501|回复: 1

进制转换函数,支持常见的十进制与二进制、八进制、十六进制之间的相互转换

[复制链接]

731

主题

577

回帖

2万

积分

管理员

积分
24978
发表于 2025-8-21 11:05:21 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

using namespace std;

// 字符转数字(如 'A' -> 10, '3' -> 3)
int charToValue(char c) {
    if (isdigit(c)) {
        return c - '0';
    } else if (isalpha(c)) {
        return toupper(c) - 'A' + 10;  // 不区分大小写
    }
    return -1;  // 无效字符
}

// 数字转字符(如 10 -> 'A', 3 -> '3')
char valueToChar(int value) {
    if (value >= 0 && value <= 9) {
        return '0' + value;
    } else if (value >= 10) {
        return 'A' + (value - 10);
    }
    return '?';  // 无效值
}

/**
 * 通用进制转换函数
 * @param number 输入数字的字符串表示
 * @param fromBase 输入数字的进制(2-36)
 * @param toBase 目标进制(2-36)
 * @return 转换后的字符串表示
 */
string convertBase(const string& number, int fromBase, int toBase) {
    // 检查进制合法性
    if (fromBase < 2 || fromBase > 36 || toBase < 2 || toBase > 36) {
        return "错误:进制必须在2-36之间";
    }

    // 步骤1:先将输入转换为十进制数
    long long decimal = 0;  // 使用long long处理较大数值
    bool isNegative = false;
    string num = number;

    // 处理负数
    if (!num.empty() && num[0] == '-') {
        isNegative = true;
        num = num.substr(1);
    }

    // 转换为十进制
    for (char c : num) {
        int val = charToValue(c);
        if (val == -1 || val >= fromBase) {
            return "错误:输入包含无效字符";
        }
        decimal = decimal * fromBase + val;
    }

    // 特殊情况:输入为0
    if (decimal == 0) {
        return "0";
    }

    // 步骤2:将十进制转换为目标进制
    string result;
    while (decimal > 0) {
        int remainder = decimal % toBase;
        result += valueToChar(remainder);
        decimal /= toBase;
    }

    // 添加负号
    if (isNegative) {
        result += '-';
    }

    // 反转结果(因为我们是从低位开始计算的)
    reverse(result.begin(), result.end());

    return result;
}

// 十进制转二进制
string decimalToBinary(int decimal) {
    return convertBase(to_string(decimal), 10, 2);
}

// 十进制转八进制
string decimalToOctal(int decimal) {
    return convertBase(to_string(decimal), 10, 8);
}

// 十进制转十六进制
string decimalToHexadecimal(int decimal) {
    return convertBase(to_string(decimal), 10, 16);
}

// 二进制转十进制
int binaryToDecimal(const string& binary) {
    // 调用通用转换函数,先转为十进制字符串再转换为整数
    return stoi(convertBase(binary, 2, 10));
}

// 八进制转十进制
int octalToDecimal(const string& octal) {
    return stoi(convertBase(octal, 8, 10));
}

// 十六进制转十进制
int hexadecimalToDecimal(const string& hex) {
    return stoi(convertBase(hex, 16, 10));
}

int main() {
    // 示例1:十进制转其他进制
    int decimalNum = 255;
    cout << "十进制 " << decimalNum << " 转换结果:" << endl;
    cout << "二进制: " << decimalToBinary(decimalNum) << endl;    // 11111111
    cout << "八进制: " << decimalToOctal(decimalNum) << endl;      // 377
    cout << "十六进制: " << decimalToHexadecimal(decimalNum) << endl;  // FF
    cout << endl;

    // 示例2:其他进制转十进制
    string binaryStr = "1010";
    string octalStr = "12";
    string hexStr = "A";
    cout << "二进制 " << binaryStr << " 转十进制: " << binaryToDecimal(binaryStr) << endl;  // 10
    cout << "八进制 " << octalStr << " 转十进制: " << octalToDecimal(octalStr) << endl;      // 10
    cout << "十六进制 " << hexStr << " 转十进制: " << hexadecimalToDecimal(hexStr) << endl;  // 10
    cout << endl;

    // 示例3:任意进制转换
    string num = "1010";  // 二进制的1010
    cout << "二进制 " << num << " 转八进制: " << convertBase(num, 2, 8) << endl;  // 12
    cout << "二进制 " << num << " 转十六进制: " << convertBase(num, 2, 16) << endl;  // A
    cout << endl;

    // 示例4:处理负数和大写字母
    string negativeHex = "-a3";
    cout << "十六进制 " << negativeHex << " 转十进制: " << convertBase(negativeHex, 16, 10) << endl;  // -163
    cout << "十六进制 " << negativeHex << " 转二进制: " << convertBase(negativeHex, 16, 2) << endl;  // -10100011
    cout << endl;

    // 示例5:高进制转换(如10进制转36进制)
    int largeNum = 123456;
    cout << "十进制 " << largeNum << " 转36进制: " << convertBase(to_string(largeNum), 10, 36) << endl;  // 2N9C

    return 0;
}

回复

使用道具 举报

731

主题

577

回帖

2万

积分

管理员

积分
24978
 楼主| 发表于 2025-8-21 11:07:56 | 显示全部楼层
[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>
#include <sstream>  // 用于字符串流转换
#include <iomanip>  // 用于设置输出格式

using namespace std;

// 1. 使用流操纵符进行输入输出的进制转换
void streamBasedConversion() {
    cout << "=== 使用流操纵符进行进制转换 ===" << endl;
    
    int num = 255;
    
    // 十进制输出(默认)
    cout << "十进制: " << dec << num << endl;
    
    // 十六进制输出(小写)
    cout << "十六进制(小写): 0x" << hex << num << endl;
    
    // 十六进制输出(大写)
    cout << "十六进制(大写): 0x" << hex << uppercase << num << endl;
    cout << nouppercase;  // 恢复小写
    
    // 八进制输出
    cout << "八进制: 0" << oct << num << endl;
    
    // 二进制没有内置操纵符,需配合其他方法
    
    cout << endl;
}

// 2. 使用字符串转换函数(stoi系列)
void stringConversionFunctions() {
    cout << "=== 使用字符串转换函数(stoi系列) ===" << endl;
    
    // 其他进制字符串转十进制整数
    string binaryStr = "11111111";    // 二进制
    string octalStr = "377";          // 八进制
    string hexStr = "FF";             // 十六进制
    
    // stoi第三个参数指定输入字符串的进制
    int fromBinary = stoi(binaryStr, nullptr, 2);
    int fromOctal = stoi(octalStr, nullptr, 8);
    int fromHex = stoi(hexStr, nullptr, 16);
    
    cout << "二进制字符串 \"" << binaryStr << "\" 转十进制: " << fromBinary << endl;
    cout << "八进制字符串 \"" << octalStr << "\" 转十进制: " << fromOctal << endl;
    cout << "十六进制字符串 \"" << hexStr << "\" 转十进制: " << fromHex << endl;
    
    cout << endl;
}

// 3. 十进制转任意进制字符串(利用字符串流)
string decimalToBase(int num, int base) {
    if (base < 2 || base > 36) return "无效进制";
    if (num == 0) return "0";
    
    bool isNegative = false;
    if (num < 0) {
        isNegative = true;
        num = -num;
    }
    
    stringstream ss;
    const string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    while (num > 0) {
        ss << digits[num % base];
        num /= base;
    }
    
    if (isNegative) ss << "-";
    
    string result = ss.str();
    reverse(result.begin(), result.end());
    return result;
}

// 4. 综合示例:各种进制间的转换
void comprehensiveExamples() {
    cout << "=== 综合转换示例 ===" << endl;
    
    // 十进制转其他进制(使用自定义函数配合标准库)
    int decimalNum = 123;
    cout << "十进制 " << decimalNum << " 转换结果:" << endl;
    cout << "二进制: " << decimalToBase(decimalNum, 2) << endl;
    cout << "八进制: " << decimalToBase(decimalNum, 8) << endl;
    cout << "十六进制: " << decimalToBase(decimalNum, 16) << endl;
    cout << "36进制: " << decimalToBase(decimalNum, 36) << endl;  // 36进制是标准库能支持的最大进制
    
    // 其他进制转其他进制(通过十进制中转)
    string hexNum = "1A3";
    int temp = stoi(hexNum, nullptr, 16);  // 先转十进制
    cout << "\n十六进制 " << hexNum << " 转换结果:" << endl;
    cout << "二进制: " << decimalToBase(temp, 2) << endl;
    cout << "八进制: " << decimalToBase(temp, 8) << endl;
    
    cout << endl;
}

int main() {
    streamBasedConversion();
    stringConversionFunctions();
    comprehensiveExamples();
    
    return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

快速回复 返回顶部 返回列表