使用 C++ bitset 操纵浮点数类型(float、double)

#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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值