前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++知识整理(进制)

C++知识整理(进制)

作者头像
Gxjun
发布2018-03-21 11:44:58
1.2K0
发布2018-03-21 11:44:58
举报
文章被收录于专栏:mlml

++输出二进制、十进制、八进制和十六进制总结

分类: C++ 2013-01-14 02:26 592人阅读 评论(0) 收藏 举报

在C++中,默认状态下,数据按十进制输入输出。如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制。但是二进制没有默认的输出格式,需要自己写函数进行转换。

输入整数n , 则在C++中cout<<hex<<n; cout<<oct<<n; cout<<dec<<n; 会分别将整数n以十六进制、八进制和十进制的形式输出

代码注解

[cpp] view plaincopyprint?

  1. #include <iostream>
  2. #include <bitset>
  3. using namespace std;  
  4. int main(void)  
  5. {  
  6. int i,j,k,l;  
  7.     cout<<"Input i(oct),j(hex),k(hex),l(dec):"<<endl;  
  8.     cin>>oct>>i;  //输入为八进制数
  9.     cin>>hex>>j;  //输入为十六进制数
  10.     cin>>k;   //输入仍为十六进制数
  11.     cin>>dec>>l; //输入为十进制数
  12.     cout<<"hex:"<<"i = "<<hex<<i<<endl;  
  13.     cout<<"dec:"<<"j = "<<dec<<j<<'\t'<<"k = "<<k<<endl;  
  14.     cout<<"oct:"<<"l = "<<oct<<l;  
  15.     cout<<dec<<endl;  //恢复十进制数输出状态
  16. return (0);  
  17. }  
代码语言:javascript
复制
#include <iostream>
#include <bitset>

using namespace std;

int main(void)
{
	int i,j,k,l;
	cout<<"Input i(oct),j(hex),k(hex),l(dec):"<<endl;
	cin>>oct>>i;  //输入为八进制数
	cin>>hex>>j;  //输入为十六进制数
	cin>>k;   //输入仍为十六进制数
	cin>>dec>>l; //输入为十进制数
	cout<<"hex:"<<"i = "<<hex<<i<<endl;
	cout<<"dec:"<<"j = "<<dec<<j<<'\t'<<"k = "<<k<<endl;
	cout<<"oct:"<<"l = "<<oct<<l;
	cout<<dec<<endl;  //恢复十进制数输出状态
	return (0);
}

调试运行

思考与提示

1.    在接收输入时,必须在cin中指明数制,否则从键盘输入时,不认八进制和十六进制数开头的0和0x标志。指明后可省略0和0x标志。

2.    进制控制只适用于整型变量,不适用于实型和字符型变量。

3.    输入数据的格式、个数和类型必须与cin中的变量一一对应,否则不仅使输入数据错误,而且影响后面其他数据的正确输入。

4.    在cin或cout中指明数制后,该数制将一直有效,直到重新指明使用其他数制。

下面是C++中二进制输出的总结

代码注解

[cpp] view plaincopyprint?

  1. #include <iostream>
  2. #include <list>
  3. #include <bitset>
  4. #include <iomanip>
  5. using namespace std;  
  6. //递归输出二进制函数
  7. void BinaryRecursion(int n)  
  8. {  
  9. int a;  
  10.     a = n % 2; // 取余
  11.     n = n >> 1;  //右移一位 相当于除以2
  12. if(0 != n)  
  13.     {  
  14.         BinaryRecursion(n);  
  15.     }  
  16.     cout<<a;  
  17. }  
  18. //使用容器转换二进制
  19. void BinaryVector(int n)  
  20. {  
  21. int temp;  
  22.     temp = n;  
  23.     list <int> L;  
  24. while(0 != temp)  
  25.     {  
  26.         L.push_front(temp % 2);  
  27.         temp = temp >> 1;  
  28.     }  
  29. for(list <int>::iterator iter = L.begin(); iter != L.end(); iter++)  
  30.     {  
  31.         cout<<*iter;  
  32.     }  
  33.     cout <<endl;  
  34. }  
  35. //一般方法,32位,逐步与1做与运算
  36. void Binarycout(int n)  
  37. {  
  38. for(int i = 31; i>= 0; i--)  
  39.     {  
  40.         cout<<((n>>i)&1);  
  41.     }  
  42.     cout<<endl;  
  43. }  
  44. //使用bitset转换二进制
  45. void BinaryBitset(int n)  
  46. {  
  47.     cout<<bitset<sizeof(int)*8>(n)<<endl;  
  48. }  
  49. int main()  
  50. {  
  51. int a = 1045, b = 2;  
  52. int c;  
  53.     c = a + b;  
  54.     cout<<setw(20)<<"BinaryRecursion("<<c<<"):";  
  55.     BinaryRecursion(c);  
  56.     cout<<endl;  
  57.     cout<<setw(20)<<"BinaryVector("<<c<<"):";  
  58.     BinaryVector(c);  
  59.     cout<<setw(20)<<"Binarycout("<<c<<"):";  
  60.     Binarycout(c);  
  61.     cout<<setw(20)<<"BinaryBitset("<<c<<"):";  
  62.     BinaryBitset(c);  
  63. return (0);  
  64. }  
代码语言:javascript
复制
#include <iostream>
#include <list>
#include <bitset>
#include <iomanip>

using namespace std;

//递归输出二进制函数
void BinaryRecursion(int n)
{
	int a;
	a = n % 2; // 取余
	n = n >> 1;  //右移一位 相当于除以2
	if(0 != n)
	{
		BinaryRecursion(n);
	}
	cout<<a;
}

//使用容器转换二进制
void BinaryVector(int n)
{
	int temp;
	temp = n;
	list <int> L;
	while(0 != temp)
	{
		L.push_front(temp % 2);
		temp = temp >> 1;
	}

	for(list <int>::iterator iter = L.begin(); iter != L.end(); iter++)
	{
		cout<<*iter;
	}
	cout <<endl;
}

//一般方法,32位,逐步与1做与运算
void Binarycout(int n)
{
	for(int i = 31; i>= 0; i--)
	{
		cout<<((n>>i)&1);
	}

	cout<<endl;
}

//使用bitset转换二进制
void BinaryBitset(int n)
{
	cout<<bitset<sizeof(int)*8>(n)<<endl;
}

int main()
{
	int a = 1045, b = 2;
	int c;
	c = a + b;
	cout<<setw(20)<<"BinaryRecursion("<<c<<"):";
	BinaryRecursion(c);
	cout<<endl;

	cout<<setw(20)<<"BinaryVector("<<c<<"):";
	BinaryVector(c);

	cout<<setw(20)<<"Binarycout("<<c<<"):";
	Binarycout(c);

	cout<<setw(20)<<"BinaryBitset("<<c<<"):";
	BinaryBitset(c);

	return (0);
}

调试运行

思考与提示

[cpp] view plaincopyprint?

  1. //递归输出二进制函数
  2. void BinaryRecursion(int n)  
  3. {  
  4. int a;  
  5.     a = n % 2; // 取余
  6.     n = n >> 1;  //右移一位 相当于除以2
  7. if(0 != n)  
  8.     {  
  9.         BinaryRecursion(n);  
  10.     }  
  11.     cout<<a;  
  12. }  
代码语言:javascript
复制
//递归输出二进制函数
void BinaryRecursion(int n)
{
	int a;
	a = n % 2; // 取余
	n = n >> 1;  //右移一位 相当于除以2
	if(0 != n)
	{
		BinaryRecursion(n);
	}
	cout<<a;
}

递归层次

使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。假设调用该递归函数的主函数为第0层,则从主函数调用递归函数进入第1层;从第i层递归调用本身为进入“下一层”,即第i+1层。反之,退出第i层递归应返回至“上一层”,即第i-1层。

为了保证递归函数正确执行,系统需设立一个“递归工作栈”作为整个递归函数运行期间使用的数据存储区。每一层递归所需信息构成一个“工作记录”,其中包括所有的实参、所有的局部变量以及上一层的返回地址。

每进入一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归就从栈顶弹出一个工作记录,则当前执行层的工作记录必须是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。

如上图所示:当n 不等于0时,保存当前层的“工作记录”,然后递归调用进入下一层,直到n 等于0 ,此时是第四层,把当前层的a值 1 打印出来,然后退出第4层递归,返回至“上一层”即第4 – 1 层,即第3层。然后打印此层的a值 0,依次递归返回打印其余层。最后得到结果为 1010.

指定数据输出宽度:用C++提供的函数setw()指定输出数据项的宽度。setw()括号中通常给出一个正整数值,用于限定紧跟其后的一个数据项的输出宽度。如:setw(8)表示紧跟其后的数据项的输出占8个字符宽度。setw()只能限定紧随其后的一个数据项,输出后即回到默认输出方式。使用setw()必须在程序开头再增加一句: #include<iomanip>

参考来源

http://www.cnblogs.com/hxsyl/archive/2012/09/18/2691693.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-08-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档