C++中的各种进制转换函数汇总

文章详细介绍了C/C++中不同进制的输出方法,如printf和C++流库的使用,以及如何通过自定义函数实现任意进制之间的转换。同时提及strtol函数的用法和面试准备中的知识体系构建建议。
摘要由CSDN通过智能技术生成

1.在C中,按指定进制格式输出如下:

#include

#include

using namespace std;

int main()

{

printf(“%o\n”,35); // 八进制格式输出:%o

printf(“%d\n”,35); // 十进制格式输出:%d

printf(“%x”,35); // 十六进格式制输出:%x或者%X

return 0;

}

// 输出结果:

43

35

23

2.在C++中,按指定进制格式输出如下:

#include

using namespace std;

int main()

{

cout<<oct<<35<<endl; // 八进制输出格式 oct

cout<<dec<<35<<endl; // 十进制输出格式 dec

cout<<hex<<35<<endl; // 十六进制输出格式 hex

return 0;

}

// 输出:

43

35

23

3.任意2-36进制数转化为10进制数

  1. 自己写一个函数

建议自己可以去敲一敲,加深记忆

#include

using namespace std;

int turn (string a,int t)

{

int sum=0;

for(int i=a.size()-1;i>=0;i–)

{

if(a[i]>=‘0’&&a[i]<=‘9’)

sum=sum*t+a[i]-‘0’;

else

{

sum=sum*t+a[i]-‘A’+10;

}

}

return sum;

}

int main()

{

string a;

int num,t;

while(cin>>a) // 超过10进制我们以大写字母表示

{

cin>>t; // t代表要转换的进制数

num=turn(a,t);

cout<<num<<endl;

}

return 0;

}

2.strtol函数

long int strtol(const char _nptr, char **endptr, int base)

strtol()会将nptr指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。

参数base的范围为2~36,和0;它决定了字符串以被转换为整数的权值。

可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;base为8时,合法字符为‘0’,‘1’,……‘7’;base为10时,合法字符为‘0’,‘1’,……‘9’;base 为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,……‘f’;base为24时,合法字符为‘0’,……‘9’,‘a’,……‘n’,base为36时,合法字符为‘0’,……‘9’,‘a’,……‘z’;等等。其中,不区分大小写,比如,‘A’和‘a’会都会被转化为10。

当字符合法时,‘0’,……‘9’依次被转换为十进制的0~9,‘a’,……‘z’一次北转换为十进制的10~35。

strtol()函数检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给_endptr。**endptr是个双重指针,即指针的指针。strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr。多数情况下,endptr设置为NULL, 即不返回非法字符串。

#include

#include

using namespace std;

int main()

{

char r[100];

int t;

while(~scanf(“%s”,r))

{

cin>>t; // t代表他原来的进制数

cout<<strtol(r,NULL,t)<<endl;

memset(r,‘\0’,sizeof®);

}

return 0;

}

// C++11 特性!!!

注意:

①如果base为0,且字符串不是以0x(或者0X)开头,则按十进制进行转化。

②如果base为0或者16,并且字符串以0x(或者0X)开头,那么,x(或者X)被忽略,字符串按16进制转化。

③如果base不等于0和16,并且字符串以0x(或者0X)开头,那么x被视为非法字符。

④对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符。

4.将10进制数转换为任意的n进制数
  • 建议自己写一个代码:

#include

#include

#include

using namespace std;

stack s;

void turn (int t,int tmp)

{

while(t!=0)

{

if(t%tmp<=10)

s.push(t%tmp+‘0’);

else

s.push(t%tmp-10+‘A’);

t/=tmp;

}

}

int main()

{

int t,tmp;

while(cin>>t>>tmp)

{

turn(t,tmp);

while(!s.empty())

{

cout<<s.top();

s.pop();

}

cout<<endl;

}

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

我搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

img

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值