赞
踩
输入:按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;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
方法二:利用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;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
最后,两种方法都得到了正确的结果:
我个人比较推荐第一种写法,算是取巧,方便简单,第二种也很不错,它揭示了float底层储存原理,也是值得大家掌握的。
好了,今天的分享就到这里,感谢观看,如果喜欢,留下一个免费的关注呗(˃ ⌑ ˂ഃ )
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。