zoukankan      html  css  js  c++  java
  • C++知识整理(进制)

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

    分类: C++ 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.   
    4. using namespace std;  
    5.   
    6. int main(void)  
    7. {  
    8.     int i,j,k,l;  
    9.     cout<<"Input i(oct),j(hex),k(hex),l(dec):"<<endl;  
    10.     cin>>oct>>i;  //输入为八进制数   
    11.     cin>>hex>>j;  //输入为十六进制数   
    12.     cin>>k;   //输入仍为十六进制数   
    13.     cin>>dec>>l; //输入为十进制数   
    14.     cout<<"hex:"<<"i = "<<hex<<i<<endl;  
    15.     cout<<"dec:"<<"j = "<<dec<<j<<' '<<"k = "<<k<<endl;  
    16.     cout<<"oct:"<<"l = "<<oct<<l;  
    17.     cout<<dec<<endl;  //恢复十进制数输出状态   
    18.     return (0);  
    19. }  
    #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.    cincout指明数制后,该数制将一直有效,直到重新指明使用其他数制。

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

    代码注解

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



  • 相关阅读:
    web.xml中listener、 filter、servlet 加载顺序及其详解 从零开始
    网站运营之门外汉并且伪理解
    win7 旗舰版 64位注册dll(regsvr32)失败解决方法
    盖是乱盖,书童逆天之初创互联网企业常见弊病
    VirtualBox中安装Windows10
    jupyter导出pdf文件的方法
    com.ibm.mm.sdk.common.DKUsageError: DGL3616A: 发生意外的 SQL 错误; ICM7015: 在库服务器的 SQL 操作期间,发生意外错误。有关错误的详细信息,请参阅数据库文档。 (STATE) : [LS RC = 7015, SQL RC = 100
    Tomcat编译java文件没有同步问题
    Google APPS申请指南
    如何用C#语言构造蜘蛛程序
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3249768.html
Copyright © 2011-2022 走看看