输入:按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底层储存原理,也是值得大家掌握的。
好了,今天的分享就到这里,感谢观看,如果喜欢,留下一个免费的关注呗(˃ ⌑ ˂ഃ )