看个好东西
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;
}