进制转换大全

// 十进制转二进制
string decToBin(int x) {
    string res;
    while (x) {
        res += x & 1 ? '1' : '0';
        x >>= 1;
    }
    reverse(res.begin(), res.end());
    return res;
}

// 二进制转十进制
int binToDec(string s) {
    int res = 0;
    for (int i = 0; i < s.size(); i++) {
        res = res * 2 + s[i] - '0';
    }
    return res;
}

// 十进制转十六进制
string decToHex(int x) {
    string res;
    while (x) {
        int t = x & 15;
        if (t < 10) res += t + '0';
        else res += t - 10 + 'A';
        x >>= 4;
    }
    reverse(res.begin(), res.end());
    return res;
}

// 十六进制转十进制
int hexToDec(string s) {
    int res = 0;
    for (int i = 0; i < s.size(); i++) {
        res = res * 16 + (s[i] >= '0' && s[i] <= '9' ? s[i] - '0' : s[i] - 'A' + 10);
    }
    return res;
}

// 十进制转八进制
string decToOct(int x) {
    string res;
    while (x) {
        res += x & 7;
        x >>= 3;
    }
    reverse(res.begin(), res.end());
    return res;
}

// 八进制转十进制
int octToDec(string s) {
    int res = 0;
    for (int i = 0; i < s.size(); i++) {
        res = res * 8 + s[i] - '0';
    }
    return res;
}

// 十进制转任意进制
string decToAny(int x, int base) {
    string res;
    while (x) {
        int t = x % base;
        if (t < 10) res += t + '0';
        else res += t - 10 + 'A';
        x /= base;
    }
    reverse(res.begin(), res.end());
    return res;
}

// 任意进制转十进制
int anyToDec(string s, int base) {
    int res = 0;
    for (int i = 0; i < s.size(); i++) {
        res = res * base + (s[i] >= '0' && s[i] <= '9' ? s[i] - '0' : s[i] - 'A' + 10);
    }
    return res;
}

// 任意进制转任意进制
string anyToAny(string s, int base1, int base2) {
    return decToAny(anyToDec(s, base1), base2);
}

// 二进制转十六进制
string binToHex(string s) {
    string res;
    for (int i = 0; i < s.size(); i += 4) {
        int t = 0;
        for (int j = i; j < i + 4; j++) {
            t = t * 2 + s[j] - '0';
        }
        if (t < 10) res += t + '0';
        else res += t - 10 + 'A';
    }
    return res;
}

// 十六进制转二进制
string hexToBin(string s) {
    string res;
    for (int i = 0; i < s.size(); i++) {
        int t = s[i] >= '0' && s[i] <= '9' ? s[i] - '0' : s[i] - 'A' + 10;
        for (int j = 3; j >= 0; j--) {
            res += (t >> j & 1) + '0';
        }
    }
    return res;
}

// 二进制转八进制
string binToOct(string s) {
    string res;
    for (int i = 0; i < s.size(); i += 3) {
        int t = 0;
        for (int j = i; j < i + 3; j++) {
            t = t * 2 + s[j] - '0';
        }
        res += t + '0';
    }
    return res;
}

// 八进制转二进制
string octToBin(string s) {
    string res;
    for (int i = 0; i < s.size(); i++) {
        int t = s[i] - '0';
        for (int j = 2; j >= 0; j--) {
            res += (t >> j & 1) + '0';
        }
    }
    return res;
}

// 十六进制转八进制
string hexToOct(string s) {
    string res;
    for (int i = 0; i < s.size(); i += 2) {
        int t = 0;
        for (int j = i; j < i + 2; j++) {
            t = t * 16 + (s[j] >= '0' && s[j] <= '9' ? s[j] - '0' : s[j] - 'A' + 10);
        }
        for (int j = 2; j >= 0; j--) {
            res += (t >> j * 3 & 7) + '0';
        }
    }
    return res;
}

// 八进制转十六进制
string octToHex(string s) {
    string res;
    for (int i = 0; i < s.size(); i += 3) {
        int t = 0;
        for (int j = i; j < i + 3; j++) {
            t = t * 8 + s[j] - '0';
        }
        if (t < 10) res += t + '0';
        else res += t - 10 + 'A';
    }
    return res;
}