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
- C++查看任意数据类型比特位串
- C中位比特操作
- c语言实现比特位的逆转
- c编程之逆转比特位
- 一个32位整数任意两个比特位交换的宏定义写法
- 一个32位整数任意两个比特位交换的宏定义写法
- C语言位运算、数据类型
- C语言——确定某数比特位中1的个数并打印其32位比特数值
- 指针,比特位操作
- 颠倒比特位
- C数据类型对齐规则包含位域
- C/C++ 中的64位数据类型详解
- C语言下使用ringbuffer实现任意数据类型的FIFO
- C语言下使用ringbuffer实现任意数据类型的FIFO
- 在C/C++算法设计中使用任意位宽
- 如何用c语言寻找十进制数二进制的奇数位.偶数位.任意位
- C语言数据类型32位和64位不同
- C/C++ 32位/64位 sizeof(数据类型)
- 1113. Integer Set Partition
- Java小白笔记--集合
- JS实现密码加密
- 2016 ACM/ICPC Asia Regional Qingdao Online hdu 5884 Sort (智商+队列)★
- 微信jsapi扫一扫接口实现(4)
- C++查看任意数据类型比特位串
- Android应用启动流程分析
- 异步处理任务工具类(AsyncTask)实现多张图片的下载(已知url)
- 第三周项目1-顺序表的基本运算
- Unity客户端架构-Util
- 初识Volley的基本用法
- 【NOIP2016提高A组模拟9.15】Map
- 使用reveal.js和wilddog实现移动端控制web端PPT展示
- Opencv之分水岭原理和实现