题目:给一个十进制的字符串例如1.25, 将其转化为二进制字符串,这个例子的结果是1.01 = 1*2^0 + 0*2^(-1) + 1*2^(-2) = 1.25。 如果不能完整的用二进制表示,输出ERROR

思路:首先整数部分和小数部分的做法不同,需要区分开。

先说整数部分,假设整数部分是n:

这个很简单,不断的对2取余然后数除2就行。例如5转成二进制:

n=13

n%2 = 1 ; n=n/2=6

n%2 = 0 ; n=n/2=3

n%2 = 1 ; n=n/2=1

n%2 = 1 ; n=n/2=0

结果就是1101,要注意先算的是低位,后算的是高位。

然后是小数部分,小数部分就不是除了,而是乘法了。

算法:每次乘以2,取整数部分就是下一位二进制值,然后减去整数部分只,剩下的小数部分继续 。

n=0.375

十进制值                 整数部分值             二进制序列            减去整数部分剩余的小数

n*2=0.75                   0                                 0                                     n=0.75

n*2=1.5                     1                                 1                                     n= 0.5

n*2=1                        1                                 1                                      n=0

所以0.375的二进制序列表示为 0.011

但是有一个问题,怎么样判断十进制是否可以用二进制完全表示呢?

结论:如果一个十进制小数能够用二进制表示,那么十进制小数的小数位数和二进制表示的小数位数是相等的。

理解也很简单:

2^(-1) = 0.1

2^(-2) = 0.25

2^(-3) = 0.125

2^(-4) = 0.0625

.....

每多除一个2,小数位数就增加一个。一般的有2^(-n)的十进制正好是n位,而且最后一位肯定是5.

那每个二进制表示的数n=0.a1a2a3...an (ai=0或1)

它的十进制值是:a1*2^(-1)+a2*2^(-2)+...an*2^(-n)

我们只需要看最后的an*2^(-n),它需要用n位小数表示,而前面的都是少于n位的,那么相加的话也就是n位的小数了。所以上面的结论就成立了。

所以现在给定一个小数n,假设它小数是k位的,那么我们最多算k次就应该可以算完,得到二进制表示,如果乘了k次2之后,依然还有小数部分,说明这个数是不能用二进制表示的。

下面附上代码:后期会开放github,有任何问题请留言或者在微博上@evagle,thanks!

/**
* @file Decimal2Binary5-2.cpp
* @Brief
* @author Brian
* @version 1.0
* @date 2013-09-02
*/ #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std; /**
* Test case:
* 1. 0 0
* 2. 2 10
* 3. 13 1101
* 4. 0.25 0.01
* 5. 0.1 ERROR
* 6. 2.25 10.01
* 7. 2.1 ERROR
*
*/
char* decimal2binary(char* decimal){
int integer = 0;
double fraction = 0;
int fraction_count = 0;
int i=0;
for(;i<strlen(decimal);i++){
if(decimal[i] == '.'){
break;
}else{
integer = integer*10 + (decimal[i]-'0');
}
}
double rate = 10;
for(i=i+1;i<strlen(decimal);i++){
fraction = fraction+(decimal[i]-'0')/rate;
rate*=10;
fraction_count++;
} int bin_int[100];
int int_count=0;
while(integer){
bin_int[int_count++]=integer%2;
integer/=2;
}
// decimal<1;
if(int_count==0){
int_count++;
bin_int[0]=0;
} int bin_fraction[100];
int bin_frac_count =0;
while(fraction_count--){
fraction*=2;
if(fraction-1 >= 0 ){
bin_fraction[bin_frac_count++] = 1;
fraction-=1;
}else{
bin_fraction[bin_frac_count++] = 0;
}
}
if(fraction>1e-9)
return "ERROR";
else{
char* binary= new char[200];
int ptr=0;
for(int i=int_count-1;i>=0;i--){
binary[ptr++]=bin_int[i]+'0';
}
if(bin_frac_count>0){
binary[ptr++]='.';
for(int i=0;i<bin_frac_count;i++){
binary[ptr++]=bin_fraction[i]+'0';
}
}
binary[ptr]='\0';
return binary;
}
} int main(){
char* str = "2.11";
cout<<decimal2binary(str)<<endl;
return 0;
}

十进制字符串转成二进制(decimal to binary)的更多相关文章

  1. JS 实现"可读"字符串转换成"二进制的01"字符串

    问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...

  2. 百度之星资格赛 调查问卷 bitset模板(直接将字符串转化成二进制数组并可以计算出十进制值)

    Problem Description 度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 mm 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项. 将问卷散发出去 ...

  3. Excel 中将大于511的十进制数转换成二进制

    If number < -512 or if number > 511, DEC2BIN returns the #NUM! error value. 所以不能直接使用DEC2BIN函数. ...

  4. 十进制数转化成二进制后包含一的数量(c++)

    #include <iostream> using namespace std;int func(int x){    int count=0;    while(x){          ...

  5. Gson字符串编码,字符串转换成图片保存,二进制转换成图片保存

    import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import ...

  6. C语言中字符串如何转换为二进制、八进制、十进制、十六进制

    在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现 相关函数: atof, atoi, atol, st ...

  7. Python如何将整数转化成二进制字符串

    Python 如何将整数转化成二进制字符串 1.你可以自己写函数采用 %2 的方式来算. >>> binary = lambda n: '' if n==0 else binary( ...

  8. Java中将0x开头的十六进制字符串转换成十进制整数

    1.Integer.toString(int i) 由于input(输入数据)是以0x开头的字符串,并不是整型.因而在用 String s = Integer.toString(input); 时用会 ...

  9. PDF转换成二进制字符串写入 HTTP 输出流

    最近项目需要做电子签章,需要网页打开PDF签章后保存:正好复习哈二进制和流的转换: 文件转换成二进制字符串写入HTTP输出流 protected void Page_Load(object sende ...

随机推荐

  1. java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方案

    在Myeclipse中运行小应用程序时出现如下异常的解决办法 java.lang.UnsupportedClassVersionError: Bad version number in .class ...

  2. hdoj 5249 KPI(treap)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5249 思路分析:使用queue记录管道中的值并使用treap能够查询第K大的功能查询第floor(m/ ...

  3. HDU 4521 小明系列问题——小明序列 (线段树维护DP)

    题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ...

  4. ps快速删除圆角图片旁白的白色区域方法

    简单实用5招的ps快速删除圆角图片旁白的白色区域方法 1.图像-模式-rgb颜色 2.双击背景取消图层锁定 3.用魔棒工具点击要删除的区域 4.delete删除 5.另存为png图片

  5. Backbone入门教程

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. Spring boot实现数据库读写分离

    背景 数据库配置主从之后,如何在代码层面实现读写分离? 用户自定义设置数据库路由 Spring boot提供了AbstractRoutingDataSource根据用户定义的规则选择当前的数据库,这样 ...

  7. ppt类似工具AxeFile使用心得

    一个所谓的傻瓜式过渡效果自动生成工具.定义好展示窗口大小,加入时序.所谓的闪烁效果,也是相当的滑稽. 是一个非专业的简单的快速PPT工具. 但是体现的确是扁平化的设计思路,很值得深思. ------ ...

  8. Sed简介 (转)

    Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓 ...

  9. Nginx 之四: Nginx服务器的压缩功能和缓存功能

    在Nginx服务器配置文件中可以通过配置Gzip的使用,可以配置在http块,server 块或者location块中设置,Nginx服务器可以通过ngx_http_gzip_module模块.ngx ...

  10. nginx配置ssl加密(单双向认证、部分https)

    nginx配置ssl加密(单双向认证.部分https) nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始 ...