引子: 为什么十进制转二进制的“辗转相除记录余数倒序输出”的算法是正确的?这个问题陪伴了Formiko半年。

实践:

  实践一:把十进制数100转换成二进制数的图

        

      上图和和下图唯一的区别在最后一位上,只是除到0和除到1的区别,但在算法本身的理解上应该不会有本质的区别。

  实践二: 十进制数100或许太大,不便于一目了然的验证。试一试十进制数1,2,3。 

      

     

      

  

        

思考:

  以上算法的思路是“对原数反复进行除法得到余数,最后将余数倒序输出”。但是看到如图对十进制数100,1,2,3的操作,都看不出原思路的由来。那我们从这个思路可以推导出几个定论。我们看到在最后倒序输出的时候,最后一个输出的数就是对原数进行第一次除法操作得到的余数。比如有人问我们:“十进制数100的二进制数的个位是多少”,我们肯定会回答:“是0。”得出这个答案的方法有很多,第一种方法是:“十进制数100的二进制是个偶数,二进制偶数的个位是0。”,第二种方法是:“对十进制数100进行一次除法得到余数0,二进制的个位是0。”第二种方法源于我们对“十进制转换二进制算法”的推导。理解这个推导是很容易的。因为二进制数转换成十进制数的方法是:“将二进制数从低位到高位乘2的n次方,将各个结果相加得到十进制数,具体来说二进制数1100100=十进制数0*20+0*21+1*22+0*23+0*24+1*25+1*26=十进制数100。”从中可以看到,将二进制数乘开的过程中,除了个位,其他位的数都乘了2n,也即将非各位结果相加得到的数必定是偶数。所以对任意一个十进制数除2,余数就是二进制数的个位。

  我们来做几个小验证。100-->0,  1-->1,   0-->0,   31-->1。

  但是这还不够,我们已经得到了计算个位的方法,但是这还不够。我们又想,二进制数的“十位”该怎么求得呢?假如有人问我们:“十进制数14的二进制数的后两位是多少?”或许我们会明白很多。这个问题等同于:“十进制数14的二进制数的“十位”和个位是多少?”。我们还是看前一个问题吧,后两位,不难想到对14除以4,得到的余数便是十进制2,即二进制10,所以十进制数14的二进制的后两位是10。这样对吗,把二进制数乘开就明白了。

  所以得到二进制数的“十位”的方法是对原数除2得到第一个余数,对原数除4得到第二个余数,第二个余数减第一个余数等于“十位”。而原算法神奇地避免了除2,除4,除8的操作,而是利用的前一次除法的商,也神奇地避免了减去低位余数的操作,也是直接利用前一次除法的商。

  到此,我们用一种方式了解了整数十进制转换二进制的原理。

总结:

  思考整数十进制转换二进制原理的一种方法就是从简单到一般,从一位到多位,从低位到高位。

题后话:

  Formiko不能自己证明以上思路的最优性,请阅读这篇博文的朋友在评论中批评指正,谢谢。

原文地址: http://formiko.info/archives/5

Formiko总结整数十进制转换二进制原理的更多相关文章

  1. PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明

    PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载   中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...

  2. Java 进制转换(二进制(负),八进制,十进制,十六进制),位运算、逻辑运算(2)

    负数的二进制表现形式:其实就是该数的绝对值取反+1. 进制转换(二进制,八进制,十进制,十六进制),原理解析 十六进制的表现形式: (2)(与.异或.左移.右移.三元运算符)

  3. C++进制转换(十进制转二进制、八进制、随意进制)

    十进制转二进制: //十进制转二进制 #include<iostream> using namespace std; void printbinary(const unsigned int ...

  4. PHP函数十进制、二进制、八进制和十六进制转换

    PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明,主要掌握各进制转换的方法,以应用于实际开发. 一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin ...

  5. 自己动手写Java大整数《3》除法和十进制转换

    之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...

  6. React十进制和二进制转换的实现和分析

    [描述] 模仿官方文档的摄氏度和华氏度的转换,实现十进制和二进制的互换. [实现] import React from 'react'; import ReactDOM from 'react-dom ...

  7. Python 进制转换 二进制 八进制 十进制 十六进制

    Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html 全局定义一定不 ...

  8. C# 进制转换(二进制、十六进制、十进制互转)

    原文地址:https://www.cnblogs.com/icebutterfly/p/8884023.html C# 进制转换(二进制.十六进制.十进制互转)由于二进制数在C#中无法直接表示,所以所 ...

  9. PHP:第一章——PHP中十进制、二进制、八进制、十六进制转换

    //十进制.二进制.八进制.十六进制转换 //十进制转换为二进制decbin()函数: //echo decbin(5);//输出:101 //十进制转换为八进制decoct()函数 //echo d ...

随机推荐

  1. socket简单通信

    粗糙简略的初版,后续多加点功能权当练手 /* ============================================================================ ...

  2. Azure File SMB3.0文件共享服务(5)

      使用Java管理Azure文件共享服务   Azure文件共享服务提供了多种方式的访问接口,包括Powershell,.Net, Java, Python等等,本章主要介绍如何使用Java来访问A ...

  3. SQL中 and or优先级问题(转)

    刚刚在项目中遇到这样一个问题,SQL语句如下: select * from LOAN_BACK_LIBRARY where LIBRARY_ID=1 or LIB_ID=1 and STATUS=3 ...

  4. VirtualBox 上安装CentOS 6.5

    目标:1.在VirtualBox中安装CentOS2.配置虚拟机网络,实现:    a.主机联网后,宿机能够通过主机上网    b.不管主机联网与否,主机都能SSH登录宿机,并且主宿机能互相传送文件 ...

  5. Unix/Linux环境C编程入门教程(27) 内存那些事儿

    calloc() free() getpagesize() malloc() mmap() munmap()函数介绍 calloc(配置内存空间) 相关函数 malloc,free,realloc,b ...

  6. 【LeetCode练习题】Partition List

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  7. C指针

    1,每行最大长度,处理的最大列号; preprocessor directives,preprocessor,预处理器读入源代码,根据预处理指令对其进行修改,把修改后 的源代码递交给编译器; 预处理器 ...

  8. OpenSuSE查看指定软件包是否安装(OpenSuSE使用RPM作为默认的软件包维护管理工具)

    suse 是 zypper se xxxxx 是搜索软件包 (查看已经安装的 软件包是否已经安装)

  9. Oracle表空间常用操作

    --创建表空间 create tablespace test datafile 'E:\test2_data.dbf' SIZE 20M autoextend on next 5M maxsize 5 ...

  10. vim改变多窗口的大小

    摘自:http://blog.163.com/lgh_2002/blog/static/44017526201031671927647/ vim改变多窗口的大小 VIM改变窗口大小 *window-r ...