当前位置:   article > 正文

32位二进制字符串转为float型的两种方法(C++)_把一个32位的数赋给float

把一个32位的数赋给float

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

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

例如:输入01000010011001100100011110101110,显示57.57

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

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

  1. union {
  2. float f;int u;
  3. } conv;

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

C++代码:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. float transform(string s) {
  5. union {
  6. float f;int u;
  7. } conv;
  8. conv.u = 0;
  9. for (int i = 0; i < s.size(); i++) {
  10. if (s[i] == '1') conv.u |= (1 << (31 - i));//把二进制写入u中,这里用到了或位运算
  11. }
  12. return conv.f;//返回共用体的float形式
  13. }
  14. int main() {
  15. string s;cin >> s;//读入
  16. float ans = transform(s);
  17. cout << ans << endl;
  18. return 0;
  19. }

方法二:利用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++代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <cmath>
  4. using namespace std;
  5. float transform(string s) {
  6. // 提取符号位
  7. int sign = s[0] - '0';
  8. // 提取指数位
  9. int exponent = 0;
  10. for (int i = 1; i <= 8; i++) {
  11. exponent += pow(2, 8 - i) * (s[i] - '0');
  12. }
  13. // 减去偏移量127
  14. exponent -= 127;
  15. // 提取尾数位并加上1.0
  16. float fraction = 1.0;
  17. for (int i = 9; i<32; i++) {
  18. fraction += pow(2, 8 - i) * (s[i] - '0');
  19. }
  20. // 计算浮点数值
  21. float value = pow(-1, sign) * fraction * pow(2, exponent);
  22. return value;
  23. }
  24. int main() {
  25. string s;cin >> s;
  26. float ans = transform(s);
  27. cout << ans << endl;
  28. return 0;
  29. }

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/986505
推荐阅读
相关标签
  

闽ICP备14008679号