C++ 二进制转换

来源:互联网 发布:做精雕编程工资多少 编辑:程序博客网 时间:2024/05/21 00:56

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

#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 << "默认输出: "<< i << " " << j << " " << k << " " << l << '\t';    cout << "六进制输出: " << oct << i << " " << j << " " << k << " " << l << endl;    cout << "十六进制输出: " << hex << i << " " << j << " " << k << " " << l << '\t';    cout << i << " " << j << " " << k << " " << l << '\t';    cout << "恢复默认输出: "<< dec << i << " " << j << " " << k << " " << l << endl;    return (0);}

思考与提示
1. 在接收输入时,必须在cin中指明数制,否则从键盘输入时,不认八进制和十六进制数开头的0和0x标志。指明后可省略0和0x标志。
2. 进制控制只适用于整型变量,不适用于实型和字符型变量。
3. 输入数据的格式、个数和类型必须与cin中的变量一一对应,否则不仅使输入数据错误,而且影响后面其他数据的正确输入。
4. 在cin或cout中指明数制后,该数制将一直有效,直到重新指明使用其他数制。

使用递归输出二进制数

#include <iostream>#include <iomanip>using namespace std;void BinaryRecursion(int n){    int a = n % 2;    n = n / 2;//  n = n >> 1;    if (0 != n)        BinaryRecursion(n);    cout << a;}int main(){    int N = 65536;    int M = 1024;    cout << "BinaryRecursion(" << setw(6) << N << "):";     BinaryRecursion(N);     cout << endl;    cout << "BinaryRecursion(" << setw(6) << M << "):";     BinaryRecursion(M);     cout << endl;}

调试结果:
BinaryRecursion(65536):10000000000000000
BinaryRecursion( 1024) : 10000000000

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

参考:http://blog.csdn.net/chiliaolm/article/details/51536155

原创粉丝点击