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

分类: 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以十六进制、八进制和十进制的形式输出

代码注解

  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. }
#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++中二进制输出的总结

代码注解

  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. }
#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);
}

调试运行

思考与提示

  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. }
//递归输出二进制函数
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

C++知识整理(进制)的更多相关文章

  1. IP地址和子网划分学习笔记之《预备知识:进制计数》

    一.序:IP地址和子网划分学习笔记开篇 只要记住你的名字,不管你在世界的哪个地方,我一定会去见你.——新海诚 电影<你的名字> 在我们的日常生活中,每个人的名字对应一个唯一的身(敏)份(感 ...

  2. C语言中进制知识总结

    1.什么是进制 进制是一种计数的方式,常用的有二进制.八进制.十进制.十六进制.任何数据在计算机内存中都是以二进制的形式存放的. 我对进制的个人理解,二进制数是以2为计算单元,满2进1位的数:八进制数 ...

  3. 【Xcode学C-4】进制知识、位运算符、变量存储细节以及指针的知识点介绍

    一.进制知识 (1)默认是十进制.八进制前面加0.即int num1=015;是13.十六进制前面加0x/0X.即int num1=0xd.结果是13.二进制前面是0b/0B,即int num1=0b ...

  4. 1、C#基础整理(进制转换的方法)

    进制 二进制转换为十进制(展权相加法) 110101 =1*2^5+1*2^4+0*2^3+1*2^2+0*2^1+1*2^0 1.  写2 2.  标指数(从右到左) 3.  乘系数(一一对应) 4 ...

  5. Java基础知识强化106:Java中 int 的各进制之间的转换

    1.二.八.十.十六进制之间的转换  下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...

  6. C#整理1——进制转换

    进制转换:二进制,八进制,十进制,十六进制. (一)二进制转十进制: 1.写2 2.标指数,从右向左,从0开始依次标记 3.乘系数,一一对应. 4.相加. 例:二进制数1101转十进制数* 1.2   ...

  7. C# 篇基础知识1——编译、进制转换、内存单位、变量

    编译:C#语言要经过两次编译,程序员编写好源代码后进行第一次编译,将源代码编译为微软中间语言(MSIL),生成可以发布的应用软件:当用户使用软件时,MSIL代码会在首次载入内存后进行第二次编译,中间语 ...

  8. WIFI基本知识整理

    这里对wifi的802.11协议中比较常见的知识做一个基本的总结和整理,便于后续的学习.因为无线网络中涉及术语很多,并且许多协议都是用英文描述,所以有些地方翻译出来会有歧义,这种情况就直接英文来描述了 ...

  9. wifi基础知识整理

    转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...

随机推荐

  1. (转)SQL Server 列转行

    原文:http://www.myexception.cn/sql-server/1078985.html1,2,3,4,5以上是一个字符串或则一逗号分隔的数字. 这里希望用一条语句查询出这样的效果: ...

  2. sscanf,sprintf用法

    #include<string.h> #include<stdio.h> int main() { ],sztime1[],sztime2[]; sscanf("12 ...

  3. 深入理解多线程(一)——Synchronized的实现原理

    synchronized,是Java中用于解决并发情况下数据同步访问的一个很重要的关键字.当我们想要保证一个共享资源在同一时间只会被一个线程访问到时,我们可以在代码中使用synchronized关键字 ...

  4. python类和实例以及__call__/__del__

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可 ...

  5. [转载] java的书

    1. Java 语言基础 谈到Java 语言基础学习的书籍,大家肯定会推荐Bruce Eckel 的<Thinking in Java >.它是一本写的相当深刻的技术书籍,Java 语言基 ...

  6. Informatica 常用组件Lookup之八 查找高速缓存

    可以配置查找转换以高速缓存查找文件或表.PowerCenter 将在处理高速缓存查找转换中的第一个数据行时在存储器中建立高速缓存.它将根据您在转换或会话特性中配置的数量来分配高速缓存区内存.Power ...

  7. Linux进程调度的运行队列

    当Linux内核要寻找一个新的进程在CPU上运行时,必须只考虑处于可运行状态的进程,(即在TASK_RUNNING状态的进程),因为扫描整个进程链表是相当低效的,所以引入了可运行状态进程的双向循环链表 ...

  8. Codeforces Round #256 (Div. 2/A)/Codeforces448A_Rewards(水题)

    解题报告 意思就是说有n行柜子,放奖杯和奖牌.要求每行柜子要么全是奖杯要么全是奖牌,并且奖杯每行最多5个,奖牌最多10个. 直接把奖杯奖牌各自累加,分别出5和10,向上取整和N比較 #include ...

  9. 使用Zxing开发Air版二维码扫描工具

    简介实现的核心要点和几个须要注意的问题: 使用开源类库:Zxing,微信也是用的这个.下载地址:http://code.google.com/p/zxing/ as版:https://github.c ...

  10. Android 的一些提示框

    1.在测试时,如何实现一个提示 可以使用 Toast.makeText(this, "这是一个提示", Toast.LENGTH_SHORT).show(); //从资源文件str ...