++输出二进制、十进制、八进制和十六进制总结
在C++中,默认状态下,数据按十进制输入输出。如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制。但是二进制没有默认的输出格式,需要自己写函数进行转换。
输入整数n , 则在C++中cout<<hex<<n; cout<<oct<<n; cout<<dec<<n; 会分别将整数n以十六进制、八进制和十进制的形式输出
代码注解
- #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<<' '<<"k = "<<k<<endl;
- cout<<"oct:"<<"l = "<<oct<<l;
- cout<<dec<<endl; //恢复十进制数输出状态
- return (0);
- }
#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<<' '<<"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++中二进制输出的总结
代码注解
- #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);
- }
#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); }
调试运行
思考与提示
- //递归输出二进制函数
- void BinaryRecursion(int n)
- {
- int a;
- a = n % 2; // 取余
- n = n >> 1; //右移一位 相当于除以2
- if(0 != n)
- {
- BinaryRecursion(n);
- }
- cout<<a;
- }
//递归输出二进制函数 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