进制转换
进制转换以十进制为桥梁。因为十进制转换为X进制采用短除法,X进制转换为十进制根据权值进行位次幂求和计算,这两种转换时有明确的方法,所以十进制作为桥梁可以解决X进制向Y进制的转换。虽然我们可以使用编程语言自己实现进制转换,但过于麻烦也容易出错,不妨借助C++的库函数来帮助我们。
方法一:bitset
bitset是一个模板类,表示一个固定大小的N位bit的序列,N由使用者自己设定的固定位数。
构造函数
默认构造函数
std::bitset<8>b; //[0,0,0,0,0,0,0,0]
unsigned long long参数构造函数
std::bitset<8>b(42); //[0,0,1,0,1,0,1,0]
string参数构造函数
std::string bit_string = "110010";
std::bitset<8> b3(bit_string); // [0,0,1,1,0,0,1,0]
常用方法
- 三种转换成员函数: to_string()、to_ulong()、to_ullong()
- 操作bits的成员函数:百科上有个很好的图片总结了常用方法就不加赘述了
方法二:std::dec, std::hex, std::oct
std::dec(十进制)、std::hex(十六进制),、std::oct(八进制)是I/O manipulator,对于标准I/O可以直接使用
std::cout << std::oct << 42; //52
std::cout << std::dec << 42; //42
std::cout << std::hex << 42; //2a
方法三:std::stoi, std::stol, std::stoll
三种方法字面就可以理解,string类型准换为int/long/long long,可以实现其他进制转换为10进制,先看一下函数原型:
以返回值为int为例,其他同理
int stoi( const std::string& str, std::size_t* pos = 0, int base = 10 );
int stoi( const std::wstring& str, std::size_t* pos = 0, int base = 10 );
参数:
str - 要转换的字符串
pos - 存储str中要转换的数字子串的下一个非数字字符地址,可以是nullptr,这种情况该参数不被使用
base - 要转换的数字的进制
#include <iostream>
#include <string>
int main ()
{
std::string str_dec = "2001, A Space Odyssey";
std::string str_hex = "40c3";
std::string str_bin = "-10010110001";
std::string str_auto = "0x7f";
std::string::size_type sz; // alias of size_t
int i_dec = std::stoi (str_dec,&sz);
int i_hex = std::stoi (str_hex,nullptr,16);
int i_bin = std::stoi (str_bin,nullptr,2);
int i_auto = std::stoi (str_auto,nullptr,0);
std::cout << str_dec << ": " << i_dec << " and [" << str_dec.substr(sz) << "]\n";
std::cout << str_hex << ": " << i_hex << '\n';
std::cout << str_bin << ": " << i_bin << '\n';
std::cout << str_auto << ": " << i_auto << '\n';
return 0;
}
输出:
2001, A Space Odyssey: 2001 and [, A Space Odyssey]
40c3: 16579
-10010110001: -1201
0x7f: 127
方法四:strtol(),atoi()
两个函数是C语言标准库函数,与方法三类似
函数原型:
char * itoa ( int value, char * str, int base );
long int strtol (const char* str, char** endptr, int base);
#include <stdio.h> /* printf */
#include <stdlib.h> /* strtol */
int main ()
{
/* strtol example */
char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
char * pEnd;
long int li1, li2, li3, li4;
li1 = strtol (szNumbers,&pEnd,10);
li2 = strtol (pEnd,&pEnd,16);
li3 = strtol (pEnd,&pEnd,2);
li4 = strtol (pEnd,NULL,0);
printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
/* itoa example */
int i;
char buffer [33];
printf ("Enter a number: ");
scanf ("%d",&i);
itoa (i,buffer,10);
printf ("decimal: %s\n",buffer);
itoa (i,buffer,16);
printf ("hexadecimal: %s\n",buffer);
itoa (i,buffer,2);
printf ("binary: %s\n",buffer);
return 0;
return 0;
}
模板:利用栈自定义函数
#include<stack>
void ten2n(stack<char>& s,__int64 i,int base){
static char digit[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(i>0){
s.push(digit[i%base]);
i/=base;
}
}