给定一个字符串类型表示的小数,输出其二进制表示

简介: 题目 给定一个字符串类型(string)表示的小数,打印出它的二进制表示。 如果这个数无法精确地表示为二进制形式,输出”ERROR”。 解答 整数部分通过不断地对2取余然后除以2来得到其二进制表示, 或是不断地和1按位与然后除以2得到其二进制表示。

题目

给定一个字符串类型(string)表示的小数,打印出它的二进制表示。 如果这个数无法精确地表示为二进制形式,输出”ERROR”。

解答

整数部分通过不断地对2取余然后除以2来得到其二进制表示, 或是不断地和1按位与然后除以2得到其二进制表示。 小数部分则通过不断地乘以2然后与1比较来得到其二进制表示。 小数部分转化为二进制,通过乘以2然后与1比较,大于等于1则该位为1,并且该值减去1; 否则该位为0。不断地通过这种操作最终能使该小数部分的值变为0的,即可精确表示。 否则将无法用有限的位数来表示这个小数部分。我们可以设定一个长度,比如说32, 在32位之内还无法精确地表示这个小数部分的,我们就认为它无法精确表示了。

代码如下:

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

string print_binary(string val){
    int pos = val.find('.', 0);
    int intpart = atoi(val.substr(0, pos).c_str());
    double decpart = atof(val.substr(pos, val.length()-pos).c_str());
    string intstr = "", decstr = "";
    while(intpart > 0){
        if(intpart&1) intstr = "1" + intstr;
        else intstr = "0" + intstr;
        intpart >>= 1;
    }
    while(decpart > 0){
        if(decstr.length() > 32) return "ERROR";
        decpart *= 2;
        if(decpart >= 1){
            decstr += "1";
            decpart -= 1;
        }
        else
            decstr += "0";
    }
    return intstr + "." + decstr;
}
int main(){
    string val = "19.25";
    cout<<print_binary(val)<<endl;
    return 0;
}

 

相关文章
|
10天前
|
Python
整型数据与字符串类型的数据进行相加
整型数据与字符串类型的数据进行相加。
25 9
|
3月前
|
C语言
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
这篇文章展示了如何使用栈(包括顺序栈和链栈)实现将十进制数值转换成八进制数值的方法,通过C语言编程演示了两种栈的实现方式和使用场景。
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
|
6月前
两个方法实现 任意两个进制间相互转换
两个方法实现 任意两个进制间相互转换
30 0
两个方法实现 任意两个进制间相互转换
|
6月前
将整数转换为枚举
将整数转换为枚举。
39 2
|
6月前
|
存储
整数类型
整数类型。
62 0
超大字符串型整数加减
超大字符串型整数加减
53 0
|
存储 关系型数据库 MySQL
尽量使用数值替代字符串类型
尽量使用数值替代字符串类型
|
存储 编译器 程序员
4.整数类型(上)
4.整数类型
184 0
|
存储 编译器 程序员
4.整数类型(下)
4.整数类型
85 0
C#中字符串是否可以转换为数值
C#中字符串是否可以转换为数值