程序员面试金典---5.2二进制转字符串

本文详细介绍了如何将介于0和1之间的浮点数转换为二进制字符串的过程。通过乘2法,逐步解析小数部分,确保不超过32位精度。当遇到无法精确表示的情况时,输出“ERROR”。此外,提供了一个具体的C++实现作为解题方案。
摘要由CSDN通过智能技术生成

题目:二进制转字符串

给定一个介于 0 和 1 之间的实数(如 0.72),类型为 double,打印它的二进制表达式。如果该数字无法精确地用 32 位以内的二进制表示,则打印“ERROR”。

一、思路

X 2 X_2 X2 X 10 X_{10} X10来表示X是二进制还是十进制。非整数用二进制表示是与十进制相仿,二进制数0.1012表示如下
0.10 1 2 = 1 ∗ 1 / 2 1 + 0 ∗ 1 / 2 2 + 1 ∗ 1 / 2 3 0.101_2 = 1*1/2^1 + 0*1/2^2 + 1*1/2^3 0.1012=11/21+01/22+11/23

  • 将这个数乘以2,检查2n是否大于或等于1.这实质上等同于“移动”小数部分,表示如下。
    r = 2 10 ∗ 0.10 1 2 = 1 ∗ 1 / 2 0 + 0 ∗ 1 / 2 1 + 1 ∗ 1 / 2 2 = 1.0 1 2 r=2_{10}*0.101_2= 1*1/2^0 + 0*1/2^1 + 1*1/2^2=1.01_2 r=2100.1012=11/20+01/21+11/22=1.012
    r > = 1 r>=1 r>=1,可知n的个位正好有个1。不断重复上述步骤,我们可以检查每个数位。

二、解法

1.乘2法

string printBin(double num) {
        if(num > 1 || num < 0) return "ERROR";
        ostringstream s;
        s << "0.";
        while(num != 0){
            if(s.str().length() >= 32){
                return "ERROR";
            }
            double r = num * 2;
            if(r >= 1){
                s << 1;
                num = r-1;
            }else{
                s << 0;
                num = r;
            }
        }
        return s.str();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值