16进制转8进制


看个好东西

16进制数 2进制数 2进制数 8进制数
1A 1 1010 11 010 32
10 1 0000 10 000 20
3b 11 1011 111 011 73

从该表格可以看出,一位16进制的数对应2进制数的4位!!!

比如,b = 1011, 0 = 0000;

3 = 011, 2 = 20

字符转换为10进制数

int myAtoi(const char& c) {
    if (c >= '0' && c <= '9') return c - '0';
    else if (c >= 'a') return 10 + c - 'a';
    return 10 + c - 'A';
}

16进制转2进制

string _16To2(const string& s16) {
    string s2;
    for (int it = s16.size() - 1; it >= 0; it--) {
        int num = myAtoi(s16[it]); // 每位16进制转化为10进制
        s2 += _10To2(num);
        // 转化为整数
        // num = atoi(s.c_str());
    }
    reverse(s2.begin(), s2.end());
    // 去除前导0 
    while (s2[0] == '0') s2 = &s2[1]; // 地址左移
    return s2;
}

10进制转2进制

string _10To2(int num) {
    string a;
    while (num) {
        a += char(num % 2 + 48);
        num >>= 1;
    }
    //reverse(a.begin(), a.end());
    while (a.size() != 4) {
        a += '0';
    }
    return a;
} 

2进制转8进制

// 一位8进制的数等于4位2进制  
string _2To8(string& s2) {
    //if (s2 != "") cout << "s2 = " << s2 << endl;
    reverse(s2.begin(), s2.end());
    //if (s2 != "") cout << "s2 = " << s2 << endl;
    string s8;
    for (int i = 0; i < (int)s2.size(); i += 3) {
        int num = 0;
        for (int j = i; j < i + 3 && j < (int)s2.size(); j++) {
            num += ((s2[j] - '0') << (j - i));
        }
        // cout << "num = " << num << endl;
        s8 += (num + 48);
    }
    reverse(s8.begin(), s8.end());
    return s8;
} 

代码演示

#include 
#include 
#include 

using namespace std;

int myAtoi(const char& c) {
    if (c >= '0' && c <= '9') return c - '0';
    else if (c >= 'a') return 10 + c - 'a';
    return 10 + c - 'A';
}

string _10To2(int num) {
    string a;
    while (num) {
        a += char(num % 2 + 48);
        num >>= 1;
    }
    //reverse(a.begin(), a.end());
    while (a.size() != 4) {
        a += '0';
    }
    return a;
} 

// 16进制转化为二进制字符串 
// 一位16进制的数等于4位2进制 
string _16To2(const string& s16) {
    string s2;
    for (int it = s16.size() - 1; it >= 0; it--) {
        int num = myAtoi(s16[it]); // 每位16进制转化为10进制
        s2 += _10To2(num);
        // 转化为整数
        // num = atoi(s.c_str());
    }
    reverse(s2.begin(), s2.end());
    // 去除前导0 
    while (s2[0] == '0') s2 = &s2[1]; // 地址左移
    return s2;
}

// 一位8进制的数等于4位2进制  
string _2To8(string& s2) {
    //if (s2 != "") cout << "s2 = " << s2 << endl;
    reverse(s2.begin(), s2.end());
    //if (s2 != "") cout << "s2 = " << s2 << endl;
    string s8;
    for (int i = 0; i < (int)s2.size(); i += 3) {
        int num = 0;
        for (int j = i; j < i + 3 && j < (int)s2.size(); j++) {
            num += ((s2[j] - '0') << (j - i));
        }
        // cout << "num = " << num << endl;
        s8 += (num + 48);
    }
    reverse(s8.begin(), s8.end());
    return s8;
} 


string _16To8(string& s16) {
    string s2 = _16To2(s16);
    s2 = _2To8(s2);
    return s2;
}


int main() {
    ios::sync_with_stdio(false);
    string s16;
    int n;
    cin >> n;
    // 输入n个16进制字符串
    while (n--) {
        cin >> s16;
        cout << _16To8(s16) << endl;
    }
    return 0;
}

文章作者: Axieyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Axieyun !
评论
评论
  目录