常用进制转换方法(取商留余)原理解析, 附基于栈实现进制转换的代码
说起进制间的转换,可能除留取余法(我自己编的名字,没找到原来叫什么名字...)是用的最普遍的了,但是我们是否想过,使用得最普遍的方法的原理到底是什么呢?
就像下面这张图的进制转换,我们知道十进制1348转八进制,只要把他一直除8直至商为0,并且把最后的余数倒过来就是我们想要的结果了。
但为什么不去怀疑我们用的公式是不是正确的呢?合法性究竟在哪呢?
下面将证明上述方法的合法性
我们知道十进制数的权值分布是这样的:
那么我们先是很无聊地来做一次十进制到十进制的转换,也就是最后的结果是不变的,还是原来的十进制数,但是我们怎么得到各个位的数字呢?
请看以下过程:
如果我们同样采用除留取余法得到各个位的数字 :
首先 1348 % 10 = 8, 这表明什么呢?
这说明我们的1348可以分成 134 个10^1 和 8 个 10^0,也就是134个10 和 8个1,这样我们就可以得到最低位个位上的数。
于是我们可以在个位上填入数字了
聪明的你可能已经发现了原理。如果没有的话不急,我们再做一步,你可能就看出来了。
这时候我们可以得到 : 1348 是由 13个10^2 和 4个10^1 和 8个10^0 组成的,对应的,我们可以在10^1上填上4
因为13个10^2 里的13还不是一位数,所以我们不能把他填在10^2上。
那么该怎么处置13呢?再对他除10^1
这时候我们就可填 10^2上的数字了,很明显是上图的3
而且因为我们的余数是1,已经是一位数了,代表1个10^3, 所以容易想到,这个1可以直接填在10^3的位置上
同理,我们把这种思想用到十进制转换成八进制上:
同理用在其他进制,比如在计算机界横行的二进制也一样。
我们观察到这种进制的转换,算出来的结果和我们要的最后数字是倒过来的,所以我们可以用栈这种结构来实现一下进制的转换。
首先我们实现一个简陋的栈结构 :
public class Stack{
private Object[] objects;
private int top = -1;
private static final int initialSize = 32;
public Stack() {
this.objects = new Object[initialSize];
}
public <T> T pop(){ //<T>意味着我们可以根据需要选择返回的类型,不用每次获得都强转,虽然有类型转换错误的危险,但是这里是演示用,不做太严谨措施
if(top < 0){ return null; }
return (T) objects[top --];
}
public <T> T getTop(){
if(isEmpty()){ return null; }
return (T) objects[top];
}
public void push(Object o){
objects[++ top] = o;
}
public boolean isEmpty(){
return top == - 1;
}
}
具体实现 :
public String conversion(int source, int destinRadix){
StringBuilder builder = new StringBuilder();
Stack stack = new Stack();
while(source != 0){
//如下的运算比较低效,为了演示没有考虑效率
int left = source % destinRadix;
source = (source - left) / destinRadix;
stack.push(left);
}
while(!stack.isEmpty()){
//如果要转10进制以上的数请自行将10定义成a,11定义成b......
builder.append(stack.pop());
}
return builder.toString();
}
测试:
- TCP/IP, WebSocket 和 MQTT
- struts2: 玩转 rest-plugin
- 设置系统环境变量立即生效的VBS脚本
- velocity模板引擎学习(1)
- mybatis 3.x 缓存Cache的使用
- XStream、JAXB 日期(Date)、数字(Number)格式化输出xml
- mac: vmware fusion中cent os启动假死的解决办法
- java:hibernate + oracle之坑爹的clob
- 启用WCF NetTcpBinding的共享端口
- asp中的md5/sha1/sha256算法收集
- UE4从零搭建CF游戏关卡(蓝图篇)
- 通用的序列号生成器库
- 利用Geneva开发SOA的安全模型
- STOMP协议介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 太慢不能忍!CPU又拿硬盘和网卡开刀了!
- 懂了!VMware/KVM/Docker原来是这么回事儿
- CPU明明8个核,网卡为啥拼命折腾一号核?
- 2020-07-22-腾讯云-slb-kubeadm高可用集群搭建
- 2020-07-23-kubernetes集群使用腾讯云cbs块存储
- 十一、详解面向对象
- 十二、面向对象实战之封装拖拽对象
- 数组reduce方法的高级用法
- 十七、详解 ES6 Modules
- 超干货!为了让你彻底弄懂 MySQL 事务日志,我通宵肝出了这份图解!
- 什么情况下不能使用最坏情况评估算法的复杂度?
- Python运算符
- kubeadm高可用集群意外删除一mater节点,重新加入失败
- Chevereto——简介及安装
- Typecho开启伪静态并隐藏index.php