Arithmetic problem | 二进制表示

题目如下:

给定一个数将其转换为二进制(均用字符串表示),如果这个数的小数部分不能在 32 个字符之内来精确地表示,则返回"ERROR"


样例

n = "3.72", 返回 "ERROR".

n = "3.5", 返回 "11.1".


解题思路:

这个题用小数乘以2取个位的常规方法显然是不明智的,二进制的拿取来源最好还是从类型上着手。拥有小数部分并能包含32位精度的类型非double莫属,但double是不支持位运算的。那么,把double所在内存copy一块即可。然而,stl内其实提供了一个很友好的容器“bitset”,这也让我们省掉转换字符的麻烦。再者,就是对 double内存分布的了解了。如图:


上图所示,double内存中指数部分,初始值为1023(01111111111),科学记数法E(10)的幂加初始值即为指数所在内存的现状。尾数部分为科学记数法小数点后的所有位,位长度不够52,其余置0。(上述的进制为二进制)。


思路实现代码如下:

void Method(char *c)
{
	double d_temp = atof(c);
	bitset<64> b_temp;
	memcpy(&b_temp, &d_temp, 8);
	string b_str = b_temp.to_string();
	bitset<11> b_exp(b_str, 1, 11);
	int i_exp = b_exp.to_ulong() - 1023;
	for (int t = 44 + i_exp; t < b_str.size(); ++t){
		if (b_str[t] == '1') {
			printf("ERROR"); return;
		}
	}
	string s_f = b_str.substr(11, i_exp + 1); s_f[0] = '1';
	string s_b = b_str.substr(12 + i_exp, 32);
	printf("%s%s.%s",b_str[0]=='1'?"-":"", s_f.data(), s_b.data());
}


  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值