写了一个将各种数据类型char/short/int/long/float/double,转换为二进制字符串输出的类,其中浮点数的机器内部表示颇有意味!
其中reinterpret_cast类型转换用法尤为重要,它根据二进制模型进行转换,但强调利用指针间的转换。
代码在Code::Blocks上编译通过。
如下
#include <string>
#include <iostream>
using namespace std;
namespace myLib
{
struct int_double
{
int high;
int low;
};
class convert
{
public:
string ToBinString(char charValue);
string ToBinString(short shortValue);
string ToBinString(long longValue);
string ToBinString(int intValue);
string ToBinString(float floatValue);
string ToBinString(double doubleValue);
};
string convert::ToBinString(char charValue)
{
string binStr;
for(int i=sizeof(charValue)*8-1;i>=0;i--)
{
if((charValue>>i) & 1)
binStr.push_back('1');
else
binStr.push_back('0');
}
return binStr;
}
string convert::ToBinString(short shortValue)
{
string binStr;
for(int i=sizeof(shortValue)*8-1;i>=0;i--)
{
if((shortValue>>i) & 1)
binStr.push_back('1');
else
binStr.push_back('0');
}
return binStr;
}
string convert::ToBinString(int intValue)
{
string binStr;
for(int i=sizeof(intValue)*8-1;i>=0;i--)
{
if((intValue>>i) & 1)
binStr.push_back('1');
else
binStr.push_back('0');
}
return binStr;
}
string convert::ToBinString(long longValue)
{
string binStr;
for(int i=sizeof(longValue)*8-1;i>=0;i--)
{
if((longValue>>i) & 1)
binStr.push_back('1');
else
binStr.push_back('0');
}
return binStr;
}
string convert::ToBinString(float floatValue)
{
string binStr;
float* fpoint=&floatValue;
int* bin_pointer=reinterpret_cast<int *>(fpoint);
for(int i=sizeof(floatValue)*8-1;i>-1;i--)
{
if((*bin_pointer)>>i & 1)
binStr.push_back('1');
else
binStr.push_back('0');
}
return binStr;
}
string convert::ToBinString(double doubleValue)
{
string binStr;
double* dpoint=&doubleValue;
int_double* bin_pointer=reinterpret_cast<int_double *>(dpoint);
for(int i=sizeof(doubleValue)*4-1;i>-1;i--)
{
if((bin_pointer->high>>i) & 1)
binStr.push_back('1');
else
binStr.push_back('0');
}
for(int i=sizeof(doubleValue)*4-1;i>-1;i--)
{
if((bin_pointer->low>>i) & 1)
binStr.push_back('1');
else
binStr.push_back('0');
}
return binStr;
}
}
int main()
{
char chValue=46;
short shValue=258;
int iValue=100;
long lValue=1224;
float fValue=35.6F;
double dValue=35.6;
myLib::convert obj;
cout<<obj.ToBinString(chValue)<<endl;
cout<<obj.ToBinString(shValue)<<endl;
cout<<obj.ToBinString(iValue)<<endl;
cout<<obj.ToBinString(lValue)<<endl;
cout<<obj.ToBinString(fValue)<<endl;
cout<<obj.ToBinString(dValue)<<endl;
}