非printf形式打印各种数据类型的十六进制和二进制

来源:互联网 发布:建党伟业有一天 知乎 编辑:程序博客网 时间:2024/06/05 22:02

一、源码实现

为了适配各种数据类型,且可以通过sizeof得到此类型的大小,所以这里采用模板形式开发。

以下是实现此功能的源码:

 

[cpp] view plaincopy
  1. // 把十进制数(long型)分别以二进制和十六进制形式输出  
  2. template <typename T>  
  3. void displayHexBin(const T& v)  
  4. {  
  5.     const unsigned char c2h[] = "0123456789ABCDEF";  
  6.     const unsigned char c2b[] = "01";  
  7.   
  8.     unsigned char* p = (unsigned char*)&v;  
  9.     char* buf = new char [sizeof(T)*2+1];  
  10.       
  11.     // 转为16进制  
  12.     char* ptmp = buf;  
  13.     p = p + sizeof(T)-1;  
  14.     for (int i = 0; i < sizeof(T); i++, --p)   
  15.     {  
  16.         *buf++ = c2h[*p >> 4];  
  17.         *buf++ = c2h[*p & 0x0F];  
  18.     }  
  19.     *buf = '\0';  
  20.     printf("hex format displayed as %s\n", ptmp);  
  21.     delete [] ptmp;  
  22.   
  23.     // 转为2进制  
  24.     p = (unsigned char*)&v; p = p + sizeof(T)-1;  
  25.     ptmp = buf = new char [sizeof(T)*8+1];  
  26.     for (int i = 0; i < sizeof(T); i++, --p)  
  27.     {  
  28.         for (int j = 0; j < 8; j++)  
  29.             *buf++ = c2b[(*p >> (7-j)) & 0x1];  
  30.     }  
  31.     *buf = '\0';  
  32.     printf("bin format displayed as %s\n", ptmp);  
  33.     delete [] ptmp;  
  34. }  

二、框图解释

以上代码分为两部分,一个是转为16进制;一部分是转为2进制。

1、以Int为例求它的16进制数

 

 

2、以Int为例求它的2  进制数

 

 三、 数据测试

 

 

 1、Int 转16 进制与2进制

[cpp] view plaincopy
  1. // 测试四.1   Int 转16 进制与2进制  
  2.     int dSourceOne = 2;  
  3.     int dSourceTwo = -2;  
  4.     displayHexBin(dSourceOne);  
  5.     displayHexBin(dSourceTwo);  

结果:

2、float 转16进制与2 进制

[cpp] view plaincopy
  1. // 测试四.2   double 转16 进制与2进制  
  2.     float fSourceOne = 3.0;  
  3.     float fSourceTwo = -2.0;  
  4.     displayHexBin(fSourceOne);  
  5.     displayHexBin(fSourceTwo);  
  6.     printf("\n");  


float类型的二进制的存放方式请参考我的另一篇文章: 浮点型数据在内存中存储的表示[转载]

 

3、double 转16 进制与2进制

[cpp] view plaincopy
  1. // 测试四.3   double 转16 进制与2进制  
  2.     double dSourceOne = 2.0;  
  3.     double dSourceTwo = -2.0;  
  4.     displayHexBin(dSourceOne);  
  5.     displayHexBin(dSourceTwo);  


 

double 类型的二进制的存放方式请参考我的另一篇文章: 浮点型数据在内存中存储的表示[转载]