C++查看任意数据类型比特位串

来源:互联网 发布:金山数据恢复账号密码 编辑:程序博客网 时间:2024/06/11 13:32

本文介绍如何查看C++基本数据类型的二进制位串,及用二进制串生成任意基本类型数据。

C++中的基本数据类型

  • char
  • bool
  • short
  • int
  • unsigned
  • long
  • float
  • double
  • long long
  • void *

有些编译平台甚至包含 long double,主流的基本数据类型最长不超过64比特位。

任意基本类型转化为比特串

布尔运算和移位操作只能用于整型类数据,这与硬件有关,其实浮点型的移位操作没有意义。如果我们想查看某个浮点型数据的二进制位图,采用普通的移位和求与是无法编译的。我们知道任何数据,首先存放在内存中的某几个连续单元,至于我们所理解的数据类型不过是对二进制位图的不同解释。所以我们可以通过把某个数据强制转化为整型,从而查看位图。注意这里的强转不是C/C++中的类型转换,而是解释方式转换,即通过指针把二进制位图解释成想要的基本数据类型。
代码如下:

typedef unsigned long long ULL;template <typename T>string toString(){    int pos = 8 * sizeof(T);    char bitsequence[pos+1];    bitsequence[pos] = 0;    ULL n = *(ULL*)&t;    while (pos--) {        bitsequence[pos] = (n & 1) + '0';        n >>= 1;    }    return bitsequence;}

比特串转化为二进制位图

和上面的过程正好相反,首先把比特串读取到整型数据中,然后通过指针把整型解释成想要的数据类型,代码如下:

T parseNumber(const string& bitstr){    ULL n = bitstr[0] - '0';    for (unsigned i=1; i<bitstr.length(); i++) {        n <<= 1;        n |= bitstr[i] - '0';    }    return *(T*)&n;}

完整封装类

#include <string>#include <iostream>using namespace std;typedef unsigned long long ULL;template <typename T>class Number {private:    T t;public:    Number(T t=0) :t(t) {}    Number(string& bitstr)    {        t = parseNumber(bitstr);    }    Number(const char* bitstr)    {        t = parseNumber(bitstr);    }    Number& operator = (string& bitstr)    {        t = parseNumber(bitstr);        return *this;    }    string toString()    {        int pos = 8 * sizeof(T);        char bitsequence[pos+1];        bitsequence[pos] = 0;        ULL n = *(ULL*)&t;        while (pos--) {            bitsequence[pos] = (n & 1) + '0';            n >>= 1;        }        return bitsequence;    }    T parseNumber(const string& bitstr)    {        ULL n = bitstr[0] - '0';        for (unsigned i=1; i<bitstr.length(); i++) {            n <<= 1;            n |= bitstr[i] - '0';        }        return *(T*)&n;    }    T getVal()    {        return t;    }};int main(){    Number<float> n = "01111111100000000000000000000000";    cout << n.toString() << endl;    cout << n.parseNumber(n.toString()) << endl;    n = "01111111100000000000000000000001";    cout << n.toString() << endl;    cout << n.parseNumber(n.toString()) << endl;    n = 1e32;    cout << n.toString() << endl;    cout << n.parseNumber(n.toString()) << endl;    return 0;}
1 0
原创粉丝点击