常用进制转换方法(万能模板,bitset,strtol,stoi,itoa,std::dec, std::hex, std::oct)

进制转换

进制转换以十进制为桥梁。因为十进制转换为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]
常用方法
  1. 三种转换成员函数: to_string()、to_ulong()、to_ullong()
  2. 操作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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值