Formiko总结整数十进制转换二进制原理
引子: 为什么十进制转二进制的“辗转相除记录余数倒序输出”的算法是正确的?这个问题陪伴了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总结整数十进制转换二进制原理的更多相关文章
- PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载 中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...
- Java 进制转换(二进制(负),八进制,十进制,十六进制),位运算、逻辑运算(2)
负数的二进制表现形式:其实就是该数的绝对值取反+1. 进制转换(二进制,八进制,十进制,十六进制),原理解析 十六进制的表现形式: (2)(与.异或.左移.右移.三元运算符)
- C++进制转换(十进制转二进制、八进制、随意进制)
十进制转二进制: //十进制转二进制 #include<iostream> using namespace std; void printbinary(const unsigned int ...
- PHP函数十进制、二进制、八进制和十六进制转换
PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明,主要掌握各进制转换的方法,以应用于实际开发. 一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin ...
- 自己动手写Java大整数《3》除法和十进制转换
之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...
- React十进制和二进制转换的实现和分析
[描述] 模仿官方文档的摄氏度和华氏度的转换,实现十进制和二进制的互换. [实现] import React from 'react'; import ReactDOM from 'react-dom ...
- Python 进制转换 二进制 八进制 十进制 十六进制
Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html 全局定义一定不 ...
- C# 进制转换(二进制、十六进制、十进制互转)
原文地址:https://www.cnblogs.com/icebutterfly/p/8884023.html C# 进制转换(二进制.十六进制.十进制互转)由于二进制数在C#中无法直接表示,所以所 ...
- PHP:第一章——PHP中十进制、二进制、八进制、十六进制转换
//十进制.二进制.八进制.十六进制转换 //十进制转换为二进制decbin()函数: //echo decbin(5);//输出:101 //十进制转换为八进制decoct()函数 //echo d ...
随机推荐
- tomcat------https单向认证和双向认证
一.https分为单向认证和双向认证: 单向认证就是说,只有客户端使用ssl时对服务器端的证书进行认证,也就是说,客户端在请求建立之前,服务器端会向客户端发送一个证书,一般情况下,这种证书都是由自己 ...
- window.opener方法的使用 js跨域
原文:window.opener方法的使用 js跨域 最近公司网站登陆加入了第三方登陆.可以用QQ直接登陆到我们网站,在login页面A中点QQ登陆时,调用了一个window.open文件打开一个lo ...
- 【HDU 5572 An Easy Physics Problem】计算几何基础
2015上海区域赛现场赛第5题. 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意:在平面上,已知圆(O, R),点B.A(均在圆外),向量 ...
- hdu 1078 FatMouse and Cheese_记忆搜索
做这类型的搜索比较少,看懂题意花了半天 题意:给你个n*n的图,老鼠一次最远走k步,老鼠起初在(0,0),每次偷吃的东西必须比之前偷吃的要大. #include<iostream> #in ...
- 【LeetCode练习题】Partition List
Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...
- Windows 应用程序结构
Windows 应用程序结构
- gateone安装(web版本ssh)
前言: 好久都没来写博客,最近忙啥去了呢? 一是忙于saltstack的二次开发,二是云计算的学习研究中,所以就一直没写东西,今天给大家介绍个工具. 好了,开始正文! 1.首先来说一下为什么要web ...
- DevExpress GridControl一些属性使用方法总结
一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 (1).gridView.AddN ...
- C# 用模板生成静态页
最近在研究静态页输出的问题,找了一些资料.做了一个简单的模板模式的静态输出 模板代码: <html xmlns="http://www.w3.org/1999/xhtml"& ...
- StringBuffer工具类整理(一)
package com.gzcivil.utils; /** * 同StringBuffer * * @author Dragon * @time 2013-3-1 */ public class S ...