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 ...
随机推荐
- Candy Sharing Game(hdoj1034)
Problem Description A number of students sit in a circle facing their teacher in the center. Each st ...
- Git学习04 --分支管理
每次commit,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而是指向master ...
- nginx上传模块nginx_upload_module使用
1.安装模块 1 cd /data/software 2 wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.0.12.t ...
- Inno Setup 精灵显示插件 InnoFairy (V2.0 版本)
原文 http://restools.hanzify.org/article.asp?id=111 一个如影随形的小精灵会令到你的安装程序更加人性化. 就是这样一个功能的Inno Setup插件, 希 ...
- LInux 下挂在Windows共享文件夹
挂载WIndow共享文件夹 //192.168.0.103/software mount -t smbfs -o username=administrator,password=“de123” / ...
- Python OpenGL学习(1): 环境配置及错误篇
系统环境是:Ubuntu 14.04 个人首次接触OpenGL,学到哪就写到哪. 1.模块安装: sudo apt-get install python-openglpip install PyOpe ...
- 7-05. 魔法优惠券(25) (数学 ZJU_PAT)
题目链接:http://www.patest.cn/contests/ds/7-05 在火星上有个魔法商店,提供魔法优惠券.每一个优惠劵上印有一个整数面值K,表示若你在购买某商品时使用这张优惠劵.能够 ...
- HTML5实战与剖析之classList属性
classList属性究竟是干什么的,我们先撇下classList不管.我们考虑这么一个问题,那就是我们如何将拥有多个类名的元素中的其中一个类名删除呢?梦龙较劲脑汁儿终于想到一个实现的方法.将拥有类名 ...
- .net通用权限框架B/S(一)
一直做软件实施,用过一些二次开发平台,最近看了一些大神写的框架,于是参考写了一个B/S通用权限框架,项目使用MVC4+EF5+EASYUI(.net framework4),开发环境vs2010+sq ...
- MySQL导入sql 文件的5大步骤
http://database.51cto.com/art/201005/200739.htm 以下的文章主要介绍的是MySQL导入sql 文件,即MySQL数据库导入导出sql 文件的实际操作步骤, ...