使用 C++ bitset 操纵浮点数类型(float、double)
2016-02-14 16:39
288 查看
#include <bitset>
bitset 类是将数据转换为二进制位(遵循 IEEE 754 的存储和表示方法,关于 IEEE 754 更多更全的使用方法和原理请见 IEEE 754——计算机中浮点数的表示方法 )。
如下:
#include <bitset> #include <limits> std::cout << std::bitset<std::numeric_limits<unsigned long>::digits>(267) << std::endl; // std::numeric_limits<unsigned long>::digits == 16 // 输出为:0000000100001011 std::cout << std::bitset<std::numeric_limits<unsigned long>::digits(267) << std::endl; // std::numeric_limits<unsigned long>::digits == 32 // 输出为:00000000000000000000000100001011
在 Python 中我们可轻易地将字符串形式的二进制数据转换为十进制类型:
# Python >>> int('1000101011', 2) 555
在 C++ 中我们通过 bitset 进行类型的转化:
// C++ std::cout << std::bitset<32>("1000101011").to_ullong() << std::endl; // 555 // 其中 to_ullong() 成员函数的返回类型为 _ULonglong // typedef unsigned long long _ULonglong;
在 IEEE 754——计算机中浮点数的表示方法 一文中我们知道十进制的小数 125.125表示为二进制的形式(IEEE 754)为:01000010111110100100000000000000。
当我们试图使用 bitset 做十进制向二进制位的转换时:
std::cout << std::bitset<32>(125.125) << std::endl; // 00000000000000000000000001111101 // 不仅和预期结果不同, // 而且编译器会提示如下的警告 // warning C4244: “参数”: 从“double”转换到“_ULonglong”,可能丢失数据
进一步查看类型定义可知:
typedef unsigned long long _ULonglong;
我们索性进行一次强制类型转换:
std::cout << std::bitset<32>(_ULonglong(125.125)) << std::endl; // 输出为: // 00000000000000000000000001111101 // 仍与预期不同
进一步我们知 125.125 是有符号的,也即其二进制位 01000010111110100100000000000000 的首位为0,而_ULonglong 不仅无符号还将双精度类型强转为了整数类型。
最终我们做如下的处理:
float n = 125.125; std::cout << std::bitset<32>(*(_ULonglong* )&n) << std::endl; // 01000010111110100100000000000000 // 此为 32 位单精度类型 // 进一步我们可将之转换为 64 位双精度类型 double m = 125.125; std::cout << std::bitset<64>(*(_ULonglong* )&m) << std::endl; // 0100000001011111010010000000000000000000000000000000000000000000
相关文章推荐
- C语言之指针复习
- c++中冒号(:)和双冒号(::)的区别
- c语言 float 保留小数点后两位数字
- C/C++中的getline函数总结
- c++ getline()函数
- leetcode83题 题解 翻译 C语言版 Python版
- 如何用 OS X 的 Xcode 写C语言程序
- mc++ gdi+ 绘图功能
- C++程序设计之类的属性
- C++运算符重载函数作为类成员函数和友元函数
- 机器学习 深度学习 C/C++学习资料汇总链接
- 算法训练 输出米字形
- C++运算符重载
- 用C++访问SQL Server数据库
- c++模板的特化
- C++ 学习(第一天)C++中调用C编译器的函数的原理
- C++ 学习(第一天)sizeof与strlen 的区别
- C语言递归操作用法总结
- VC++使用ADO连接SQL Server数据库
- C++中为什么要有.h文件和.cpp文件