java里面是有进制间互换现成的方法的:

public class十进制与各进制的相互转换 {public static voidmain(String[] args){//java已经实现的机制:十进制转换为二进制

int decimal = 10;

System.out.println("十进制数:"+decimal+",转换为二进制:"+Integer.toBinaryString(decimal));

System.out.println("十进制数:"+decimal+",转换为八进制:"+Integer.toOctalString(decimal));

System.out.println("十进制数:"+decimal+",转换为十六进制:"+Integer.toHexString(decimal));

System.out.println("二进制数:"+"1010" +",转换为十进制:"+Integer.valueOf("1010", 2));

System.out.println("八进制数:"+"12" +",转换为十进制:"+Integer.valueOf("12", 8));

System.out.println("十六进制数:"+"a" +",转换为十进制:"+Integer.valueOf("a", 16));

}

}

结果:

十进制数:10,转换为二进制:1010十进制数:10,转换为八进制:12十进制数:10,转换为十六进制:a

二进制数:1010,转换为十进制:10八进制数:12,转换为十进制:10十六进制数:a,转换为十进制:10

但如果不取Integer的内含方法,我们要怎么实现进制之间的转换呢?

下面针对二进制-->十进制实现其算法过程:

一般思维:

当问到二进制数转为十进制数,大多数人脑里第一反应的应该是这样一个逻辑过程:

二进制数:1010

十进制数:1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 =  8 + 0 + 2 +0 = 10

按这个思路,java代码可以这样实现:

方法一:

public intbinaryToDecimal(String inMsg){int x = 0;int mul = 1;for(int i = inMsg.length()-1;i>0;i--){

x+= mul*(inMsg.charAt(i)=='1'?1:0);

mul*=2;

}

System.out.println(mul);returnmul;

}

好奇在网上也找了下其他实现方法:

方法二:

String radix = "1010";

public intmethod(String radix){int x = 0;for(charc:radix.toCharArray())

x= x*2 + (c=='1'?1:0);

System.out.println(x);returnx;

}

对比以上两个方法,方法一和我们平常的思维是一致的,但是方法二就不大好理解了,略作思考后,发现可以这样理解:

1、从for(char c:radix.toCharArray())这行代码可以看出,需要将待求解的二进制数转换为char数组;显然,当待求解二进制数为1010时,char数组即为:char[1,0,1,0],数组中有4个元素,那么也就是说for循环要循环运行4次。

2、显而易见,for循环里面的算式组成部分的(c=='1'?1:0)目的就是为了拿到当前循环时对应二进制数组下标的值。

如:第一次循环,拿到二进制数组下标为0的值:1

第二次循环,拿到二进制数组下标为1的值:0

第三次循环,拿到二进制数组下标为2的值:1

第四次循环,拿到二进制数组下标为3的值:0

3、算法:x = x*2 + (c=='1'?1:0) 的原理解析:前半部分x*2,是为了实现二进制数组元素的幂次相乘(之前的int x = 0其实实现了char[]数组的size()-1的作用),后半部分获取了下次进行幂运算的char数组的元素值。

解析:

第一次循环:看方法二的第三行代码:int x = 0;x初始值为0,就导致了for循环第一次循环时,运算为:0*2+1  ,即只会得到算式(c=='1'?1:0)的值,即二进制数组第一个元素的值:1 ;这时循环已经进行了1次,还剩3次,所以这里的1会在后面的3次循环里分别乘以2 , 即1*2*2*2;

第二次循环:算式为: (0*2 + 1)*2 + 0  == 0*2*2 + 1*2 + 0  ,第一部分0*2*2不用管,因为这个是int x=0起作用用的, 第二部分是第一次循环时得到1的第一次幂运算1*2, 第三部分就是二进制数组下标为1的元素:0,也是下一次循环会进行幂运算的数。   这时我们发现总共的4次循环已经进行了2次,剩下2次,所以这里的下次幂运算值:0会在后面的2次循环里分别乘以2,即0*2*2;

第三次循环:算式为: ((0*2 + 1)*2 + 0)*2 +1  == 0*2*2*2 + 1*2*2 + 0*2 +1  ,第一部分0*2*2*2不用管,第二部分是第一次循环时得到1的第二次幂运算1*2*2, 第三部分是第二次循环时得到0的第一次幂运算0*2,第四部分就是二进制数组下标为2的元素:1,也是下一次循环会进行幂运算的数。   这时我们发现总共的4次循环已经进行了3次,剩下1次,所以这里的下次幂运算值:1会在后面的1次循环里乘以2,即1*2;

第四次循环:算式为: (((0*2 + 1)*2 + 0)*2 +1 )*2 +1 == 0*2*2*2*2 + 1*2*2*2 + 0*2*2 +1*2 + 0  ,第一部分0*2*2*2*2不用管,第二部分是第一次循环时得到1的第三次幂运算1*2*2*2, 第三部分是第二次循环时得到0的第二次幂运算0*2*2,第四部分是第三次循环时得到1的第一次幂运算1*2,第五部分就是二进制数组下标为3的元素:0,也是下一次循环会进行幂运算的数。   这时我们发现总共的4次循环已经进行了4次,剩下0次,

所以本次运算就是整个算法的结果: 0*2*2*2*2   +   1*2*2*2   +   0*2*2   +   1*2   +   0  =  0 + 8 + 0 + 2 + 0  =  10 ,这样看是不是觉得很熟悉!没错,其实原理还是和方法一一样样的。

啰嗦了点,希望能帮到你理解!:)

java 二进制转换为十进制_二进制转换十进制 算法解析相关推荐

  1. c++二进制转十进制_二进制,八进制,十进制,十六进制转换详解~

    点 击 上 方 蓝 字 关 注 我 们 哦 ^-^ 本文思维导图: 1.数制:用一组固定的数字和一套统一的规则来表示数目的方法称为数制. 进位计数制的要素: ①.数码:用来表示进制数的元素. 二进制: ...

  2. sql二进制转十进制_了解SQL十进制数据类型

    sql二进制转十进制 This article aims to walk you through the SQL Decimal data type and its usage with variou ...

  3. php 二进制 转换为字符串,php二进制转换为字符串的案例

    php二进制转换为字符串的案例 发布时间:2020-10-09 14:58:40 来源:亿速云 阅读:97 作者:小新 小编给大家分享一下php二进制转换为字符串的案例,相信大部分人都还不怎么了解,因 ...

  4. c++将小数化为二进制_C++版进制转换(十进制,二进制,十六进制整数和小数)

    进制转换C++代码 #include #include #include #include using namespace std; void MainMenu() { system("cl ...

  5. java对象转换为JSON日期格式转换处理

    JSON日期格式转换的时候,默认情况下JSON对date类型会转换成一个多属性对象,如: "createTime":{ "date":11, "day ...

  6. 二进制树形搜索算法_二进制搜索

    二进制树形搜索算法 二进制搜索用于在 值的排序列表 . 它选择排序值数组中的中间元素,并将其与目标值进行比较: 这就是我们在数组中寻找的关键. 如果它小于目标值,则在中间元素之后搜索,直到数组末尾. ...

  7. java 英文字符串排序_英文字符串排序算法

    编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...

  8. java符号三角形问题_实验四 回溯算法和分支限界法 符号三角形问题

    基本题一:符号三角形问题 一.实验目的与要求 1.掌握符号三角形问题的算法: 2.初步掌握回溯算法: 二.实验题图 下面都是"-".下图是由14个"+"和14个 ...

  9. java边缘检测算子代码_图像边缘检测(Canny 算法)的Java实现

    快速排序 一. 算法描述 快速排序是对冒泡排序的一种改进.在冒泡排序中,记录每次都是与相邻位置上的数据作比较,因此每次只能移动一个位置.而在快速排序中,记录的比较和移动都是从两端向中间进行的. 其主要 ...

  10. java负载均衡原理_多种负载均衡算法及其 Java 代码实现

    首先给我们介绍下什么是负载均衡 负载均衡 树立在现有网络结构之上,它供给了一种廉价有用通明的办法扩展 网络设备和 效劳器的带宽.添加 吞吐量.加强网络数据处理才能.进步网络的灵敏性和可用性. 负载均衡 ...

最新文章

  1. ie 打开后端发过来的pdf_某办公软件PDF阅读器漏洞挖掘及Crash分析
  2. 从官网下载的python包如何使用-如何下载python包
  3. matlab语言 列车平稳性指标,铁道车辆平稳性分析报告.docx
  4. 从VSS到SVN再到Git 记Git的基本操作
  5. 计算机操作系统(慕课版)各章思维导图
  6. android隐藏桌面图标
  7. 烤仔TVのCCW丨密码学通识(二)什么是“安全的加密”
  8. 《使用机器视觉从照片中确定西瓜质量》论文笔记
  9. Windows电脑上最好的3个epub阅读器
  10. Matplotlib绘制三维数据点与线
  11. 51个Python鲜为人知的秘密特性,老司机看完都惊叹不已
  12. 浅谈SPICE原理及应用
  13. 考研逻辑-逻辑4主讲人:王超-2020-05-16
  14. 不同系统之间数据对接方式
  15. 2022年如何成为一名优秀的大前端Leader
  16. IP通讯名词解释-BLF(Busy Lamp Field)
  17. 第019讲:函数:我的地盘听我的
  18. consul服务注册常见bug
  19. 5种主流的PCBA(PCB)电路板测试方法
  20. 单片机温湿度测量程序编程

热门文章

  1. 【服务器数据恢复】服务器Raid5阵列mdisk磁盘离线的数据恢复案例
  2. js手机端上传图片,带压缩图片
  3. 返乡报备小程序开发制作功能介绍
  4. 全国各省市区域mysql_中国省市区数据表(MySQL版)
  5. java 修改文件编码_java中怎么获取、设置文件编码格式?
  6. 弘辽科技:限制店铺流量上涨的七大原因
  7. OpenStack在天河二号的大规模部署实践(转)
  8. 新浪导航栏下拉菜单案例展示
  9. java程序设计基础陈国君_Java程序设计基础(第6版)
  10. Oracle大幅裁员,甲骨文云计算业务在华遭遇“滑铁卢”?