引子: 为什么十进制转二进制的“辗转相除记录余数倒序输出”的算法是正确的?这个问题陪伴了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. delphi 操作 TWebBrowser 实现自动填表(JQuery脚本与 OleVariant 方法)

    版本:DELPHI XE8 操作交通银行信用卡申请表单(2016-03-23),网址如下: https://creditcardapp.bankcomm.com/applynew/front/appl ...

  2. 竹林蹊径-深入浅出Windows内核开发作者的博客

    http://blog.csdn.net/blog_index http://blog.csdn.net/blog_index/article/details/6012054 http://downl ...

  3. 浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)

    shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...

  4. 在cocos2d-x界面中嵌入Android的WebView

    在Cocos2dxActivity.java中, (1) 增加函数onCreateLayout, [java]  view plain copy   public LinearLayout onCre ...

  5. html类,id规范命名

    DIV+CSS的命名规则 SEO(搜索引擎优化)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面中部IT网将对目前流行的CSS+DIV的命名规则整理如下: 页头:he ...

  6. 【LeetCode练习题】Next Permutation

    Next Permutation Implement next permutation, which rearranges numbers into the lexicographically nex ...

  7. ROW_NUMBER() OVER函数的基本用法用法【转】

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW ...

  8. Java Swing界面编程(27)---JRadioButton事件处理

    在单选button操作中.能够使用ItemListener接口进行事件的监听. package com.beyole.util; import java.awt.Container; import j ...

  9. 单调旋转数组的TopK问题

    问题描述:输入一个单调旋转后的数组,求该数组中的第k小的元素. 分析:很多人看到这个题目会有点懵,可能读者不知道什么是旋转数组,我先解释下两个概念, 旋转数组的定义:把一个数组的前几项元素移动到数组的 ...

  10. Basic Concepts of Block Media Recovery

    Basic Concepts of Block Media Recovery Whenever block corruption has been automatically detected, yo ...