进制的转换

package conversationofnumbersystems;

public class Test1 {
    public static void main(String[] args){
        /**
      * 计算机刚开始都是二进制,0101的形式,但是由于二进制表示大数据太长了,所以就产生了8进制和16进制用来存储大数据。
      * 8进制是将二进制的3个位作为一段,使用其十进制的值表示
      * 16进制是将二进制的4个位作为一段,使用十进制的值表示,不过10~15使用ABCDEF表示,a~f支持大小写


* 数制是用一组固定的符号和统一的规则来表示数值的方法 * 计算机底层使用的数制是二进制 * java编写程序使用的是十进制,但是java底层使用的仍然是二进制 * 常用的进制还包括8进制和16进制 * * 十进制的基本数字是0~9,逢10进位 * 10被称为基数,10的n次幂被称为权 * 10000=1*10^4(注意:这里我的^是表示指数的,在数学里是这样表示的,但是在计算机语言中^表示的不是指数,是一种位运算符,将两个数转换成2进制,不同则为1) * 1000=1*10^3 * 23678=2*10^4+3*10^3+6*10^2+7*10^1+8*10^0 * * 二进制的基本数字是0 1,逢2进位 * 二进制的基数为2,权为2的n次方
     * 在Java中使用0b作为前缀 * 1=1*2^0 * 10=1*2^1+0*2^0 * 100=1*2^2+0*2^1+0*2^0 * 1111(二进制)=1*2^3+1*2^2+1*2^1+1*2^0=15 或者1111+1=10000-1=2^5-1=15 * * 十六进制 * 基本数字: 0 1 2 3 4 5 6 7 8 9 A B C D E F (字母可以是大写表示也可以小写表示) * 基数为16,权为16的n次方 * 十六进制实际上是二进制的简写,方便专业人员书写二进制数据,因为二进制表示大数据过长 * 在java中十六进制用0X或者0x作为前缀 * 1=1*16^0 * 10=1*16^1+0*16^0 * 5e=5*16^1+14*16^0=5*16+14*10=94 * * 十六进制转化为十进制 * 0x12 =1*16^1+2*16^0=18 * 十六进制转换为二进制 * 0x12=00010010 * 方式:因为16是2的4次方,所以可以将16进制的每一位转换成为4位的二进制然后联合起来,十六进制和二进制每一位的连接使用的是加法而不是乘法 * * 照这个逻辑,8进制是2的3次方,所以八进制转换成为2进制就是将每一位8进制的数转换成3位的2进制数,联合起来。 * 012=001010 * 十六进制和8进制的转换可以通过2进制作为媒介达到效果。 * 二进制转换成为16进制和2进制转换成为8进制也是类似的原理 * * 将10进制转换成为2进制、8进制、16进制 * 转为2进制,10一直除2,知道商为0,将余数倒叙联合就是了 * 除数 被除数 商 余数 * 2 10 5 0 * 2 5 2 1 * 2 2 1 0 * 2 1 0 1 * 得到:1010=2^3+2^1=10 * 8 56 7 0 * 8 7 0 7 * 得到070=7*8^1+0*8^0=56 * 16 466 29 2 * 16 29 1 13 * 16 1 0 1 * 得到0x1D2 *
*/ int x=0x1D2; System.out.println(x); /*System.out.println(Integer.toBinaryString(18)); System.out.println(Integer.toOctalString(18));*/ } }

8421码将2进制转换成为10进制:
8421码的原理是将一些常用的二进制的位值代表的十进制列出来,查找替换进行十进制和二进制的转换。

1  1  1  1  1  1  1  1
128 64 32 16 8 4 2  0

二进制转10进制:
0b10010=2+16=18
十进制转2进制:
18=16+2=0b10010
178=128+32+16+2=0b10110010

浮点型的进制转换:
浮点型的存储结构和整形的不一样
浮点型的存储范围大于long型。
不是太明白,不想深究了。

float类型数字在计算机中用4个字节存储。遵循IEEE-754格式标准:
    一个浮点数有2部分组成:底数m和指数e

底数部分 使用二进制数来表示此浮点数的实际值
指数部分 占用8bit的二进制数,可表示数值范围为0-255

但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。
    所以,float类型的指数可从-126到128

底数部分实际是占用24bit的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit
    科学计数法。

格式:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S表示浮点数正负    
E指数加上127后的值得二进制数据
M底数

举例:
17.625在内存中的存储

首先要把17.625换算成二进制:10001.101

    整数部分,除以2,直到商为0,余数反转。
整数部分:17=10001
    小数部分,乘以2,直到乘位0,进位顺序取。
小数部分:
  0.625*2=1 .25
  0.25*2=0 .5
  0.5*2=1  .0
  0*2=0  .0
......
得到:1010...

在将10001.101右移,直到小数点前只剩1位:
    1.0001101 * 2^4 因为右移动了四位

这个时候,我们的底数和指数就出来了
底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011
符号部分是整数,所以是0
综上所述,17.625在内存中的存储格式是:
01000001 10001101 00000000 00000000    

换算回去:自己做。



原文地址:https://www.cnblogs.com/aigeileshei/p/5505979.html