32位二进制字符串转为float型的两种方法(C++)

输入:按4字节浮点数格式用0和1组成的字符串从键盘输入

输出:转换为十进制浮点数显示

例如:输入01000010011001100100011110101110,显示57.57

方法一:利用共用体(联合体)

float和int均占4个字节,定义一个float和int的共用体

 union {
     float f;int u;
 } conv;

将字符串写入共用体的int形式中,以共用体的float形式读取

C++代码:

#include <iostream>
#include <string>
using namespace std;
float transform(string s) {
    union {
        float f;int u;
    } conv;
    conv.u = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '1') conv.u |= (1 << (31 - i));//把二进制写入u中,这里用到了或位运算
    }
    return conv.f;//返回共用体的float形式
}
int main() {
    string s;cin >> s;//读入
    float ans = transform(s);
    cout << ans << endl;
    return 0;
}

方法二:利用float的存储特性

float占4个字节,32个比特位,二进制表示下,左边是高位,右边是低位。

从高位向低位看去,应有:

第1位为符号位,0为正,1为负;

第2-9位(共8位)是指数位;

第10到32位(共23位)是尾数位

比如 01000010011001100100011110101110

按符号位,指数位,尾数位可分为:

计算公式就是value = pow(-1, sign) * fraction * pow(2, exponent)

其中sign就是符号位,0或者1;fraction是尾数位代表的值加1.0; exponent是指数位代表的值减去偏移量127

C++代码:

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
float transform(string s) {
    // 提取符号位
    int sign = s[0] - '0';

    // 提取指数位
    int exponent = 0;
    for (int i = 1; i <= 8; i++) {
        exponent += pow(2, 8 - i) * (s[i] - '0');
    }

    // 减去偏移量127
    exponent -= 127;

    // 提取尾数位并加上1.0
    float fraction = 1.0;
    for (int i = 9; i<32; i++) {
        fraction += pow(2, 8 - i) * (s[i] - '0');
    }

    // 计算浮点数值
    float value = pow(-1, sign) * fraction * pow(2, exponent);
    return value;
}
int main() {
    string s;cin >> s;
    float ans = transform(s);
    cout << ans << endl;
    return 0;
}

最后,两种方法都得到了正确的结果:

我个人比较推荐第一种写法,算是取巧,方便简单,第二种也很不错,它揭示了float底层储存原理,也是值得大家掌握的。

好了,今天的分享就到这里,感谢观看,如果喜欢,留下一个免费的关注呗(˃ ⌑ ˂ഃ )

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值