java常用的进制之间转换


区分二进制,八进制,十进制,十六进制 

如果这样定义个变量
int a = 18;
变量a到底是几进制的呢?java中有规定,如果要明确一个变量是几进制数的,必须添加相关标识,否则默认是十进制数
二进制以0b开头,八进制以0开头,十六进制以0x或者0X开头
int a = 18;
对应二进制数 int a = 0b10010;
对应八进制数 int a = 022;
对应十六进制数 int a = 0x12;

二进制 : 只能是 0 或者是 1 
八进制 : 0,1,2,3,4,5,6,7
十进制 : 0,1,2,3,4,5,6,7,8,9
十六进制 : 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f


二进制,八进制,十进制,十六进制他们之间到底是怎么转换的呢
十进制 转成 二进制,八进制,十六进制

十进制转成对应二进制,十进制数除以2,余数倒叙排列即可,(十进制转成对应八进制,十六进制同理)
例如 : 
int a = 123;
如下图 : 


<p>余数倒叙排列 1111011</p>


十进制转成对应八进制,十六进制同理,如下图


<p>十进制转成对应八进制,余数倒叙排列 173  </p>
<p>十进制转成对应十六进制,余数倒叙排列 7b  </p>
<p>兄弟们也可以用函数去验证一下 :  </p>
<p>Integer.toBinaryString(123)</p>
<p>Integer.toOctalString(123)</p>
<p>Integer.toHexString(123)</p>
<p>顺带一句</p>
<p>也可以取字符的二进制,Integer.toBinaryString('A'); 字符 A 对应的ascoll码值 65的二进制 1000001</p>

 二进制,八进制,十六进制 转成 十进制 

二进制数转成十进制数,底数乘以位数的幂(八进制,十六进制 转成 十进制同理),看不懂不用记
例如 :
int a = 0b10010;
//你可以把10010,放在数组里面,[1,0,0,1,0]
数值对应的下标(只不过他们的下标反过来了)
0   0
1   1
0   2
0   3
1   4
二进制计算 => 1*2^4+0*2^3+0*2^2++1*2^1+0*2^0 = 18

八进制数转成十进制数,例如 : 
int b = 022;
2*8^1+2*8^0 = 18

十六制数转成十进制数,例如 : 
int c = 0X12;
1*16^1+2*16^0 = 18  

兄弟们也可以用函数去验证一下 :
Integer.parseInt("10010",2)    
Integer.parseInt("22",8)
Integer.parseInt("12",16)

二进制 转成 八进制,十六进制
三位二进制数,对应一位八进制数(不足三位的,从前面开始补0),将结果顺序排序,why? 2^3 = 8

用上面的二进制数举例:
int a = 0b10010;
10010,前面补 0,得 010010, 
010  010
 2    2 => 最终结果为 22

四位二进制数,对应一位十六进制数(不足三位的,从前面开始补0),将结果顺序排序,why? 2^4 = 16
还是用上面的二进制数举例:
int a = 0b10010;
10010,前面补 0,得 00010010,
0001  0010
  1    2 =>最终结果为 12

### 十进制小数与二进制之间的相互转换
整数部分,依然是除以1,取余数倒叙排列,小数部分乘以2,取出整数部分,剩下的小数部分继续乘以2,直到小数部分为0,
或者达到精度要求为止,将整数部分顺序排列
这也是 double 数据类型进行运算的时候为什么会出现误差
例如 : 
int a = 0.125;
0.125*2 = 0.25 整数部分 0
0.25*2 = 0.5   整数部分 0
0.5*2 = 1      整数部分 1
最终结果 : 0.001
反之,二进制小数,怎么转成十进制呢 ? ,和二进制转成十进制数同理,底数乘以位数的幂,只不过是副指数幂
用上面的结果举例 : 0.001
0*2^-1 + 0*2^-2 + 1*2^-3 = 0.125
 负数怎么转换呢?
先看几个概念 :
在计算机科学中,bit是表示信息的最小单位,叫做二进制位;一般用0和1表示
原码 : 就是二进制数表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小
反码 :正数的反码和原码相同,负数的反码,是原码逐位取反,符号位除外
补码 : 正数的补码和原码相同,负数的补码,是其反码末位加 1

十进制负数转成二进制 : 先取负数的绝对值,转换成二进制原码,再取反码,再取补码,就是负数的二进制了

例如 :
int a = 5; // 正数
二进制数 : 101
int b = -5; // 负数
正数 5 的二进制数 : 101
原码 : 101
反码 : 010 (原码取反)
补码 : 011 (反码末尾数加一)
用 Integer.toBinaryString(-5) 验证,结果应该是 : 11111111111111111111111111111011 (int类型占四个字节,32位bit)

那十进制负数怎么转成八进制,十六进制呢 ? 

上面不是得出 -5 的二进制了吗,再根据二进制转八进制,转十六进制,就能得到负数的八进制数,十六进制数了

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页