挺好用的 C++ 进制转换

本文最后更新于:4 years ago

日常刷题中,会遇到一些涉及进制转换的问题。而C++作为高级语言(手动滑稽.webp),自然也有不错的进制转换的方法,封面是二进制的发明者,莱布尼茨。

1.cout / cin

八进制、十进制、十六进制互相转换

1
2
3
4
5
6
7
8
9
10
11
// 以 十六进制 转 八进制为例
int num;
cin >> hex >> num;
cout << oct << num;

/*
其他同理
oct:八进制
dec:十进制
hex:十六进制
*/

2.bitset函数

各种进制 转 二进制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bitset>
int main() {
// 数字 十进制 转 二进制
int num_10 = 9;
bitset<6> b(num_10); // 6决定二进制位数
cout << b; // 001001

// 数字 八进制 转 二进制
int num_8 = 010; // 八进制前面要加 0
bitset<6> b(num_8);
cout << b; // 001000

// 数字 十六进制 转 二进制
int num_16 = 0x1A; // 十六进制前面要加 0x
bitset<8> b(num_16);
cout << b; // 00011010

// 字符串 转 二进制
string str = “10010”;
bitset<8> b(str);
cout << b; // 0010010

//简便写法
cout << bitset<8>(num_or_str);
}

3.自编函数

n进制 转 十进制

1
2
3
4
5
6
7
8
9
10
11
12
13
// str 为代转字符串,n 为进制
int ntoi (string str, int n) {
int ans;
for (int i = 0; i < str.size(); i++) {
if (str[i] >= '0' && str[i] <= '9') {
ans = ans * n + str[i] - '0';
} else {
ans = ans * n + str[i] - 'a' + 10;
// 如果 字符串中是大写就 - ‘A’,小写就 - ‘a’
}
}
return ans;
}

十进制 转 n进制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string iton (int num, int n) {
string ans="";
do {
int t = num % n;
if(t >= 0 && t <= 9) {
ans += t + '0';
} else {
ans += t - 10 + 'a';
}
num /= n;
} while (num != 0);
reverse(ans.begin(), ans.end());
return ans;
}

4.C库函数

<cstdlib> 中的各种函数。

函数描述
double atof(const char *str)把参数 str 所指向的字符串转换为一个浮点数。
int atoi(const char *str)把参数 str 所指向的字符串转换为一个整数。
long int atol(const char *str)把参数 str 所指向的字符串转换为一个长整数。
double strtod(const char *str, char **endptr)把参数 str 所指向的字符串转换为一个浮点数。
long int strtol(const char *str, char **endptr, int base)把参数 str 所指向的字符串转换为一个长整数。
unsigned long int strtoul(const char *str, char **endptr, int base)把参数 str 所指向的字符串转换为一个无符号长整数。

5.cout 的成员函数

详见:输入输出流

cout.setf():输出格式控制。

1
2
3
4
5
6
7
int number = 10;

// 控制进制
cout.unsetf(ios::dec); // 卸载当前默认的 10 进制输出方式。
cout.setf(ios::oct); // 设置成八进制输出
cout.setf(ios::showbase); // 显示八进制数字前的0,十六进制数字前的0x
cout << number << endl; // 此时,打印为:012

挺好用的 C++ 进制转换
https://www.aimtao.net/radix-transformation/
Posted on
2020-03-28
Licensed under