挺好用的C++进制转换

本文最后更新于:2 个月前

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

1.cout / cin

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

// 以 十六进制 转 八进制为例
int num;
cin >> hex >> num;
cout << oct << num;

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

2.bitset函数

各种进制 转 二进制

#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进制 转 十进制

// 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进制

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():输出格式控制。

int number = 10;

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

本博客所有文章均个人原创,除特别声明外均采用 CC BY-SA 4.0协议,转载请注明出处!

 目录

致敬李文亮及各路英雄好汉!