进制转换【二进制、八进制、十进制、十六进制】

1、常用进位数制

常用的进位数制
进位制 二进制 八进制 十进制 十六进制
规则 逢二进一 逢八进一 逢十进一 逢十六进一
基数 r=2 r=8 r=10 r=16
数符 0,1 0,1,2....,7 0,1,2....,9 0,1,2....,9,A,B,C....F
2^i 8^i 10^i 16^i
形式表示符 B O D H

可以看出,十进制的计数制中权的值是基数10的某次幂,其他计数制同理。因此,任何一种进位计数制表示的数都可以写成按权展开的多项式,在此基础上实现不同计数制的相互转换。

进制转换在线工具:在线进制转换

2、十进制转化成其他进制

2.1、概念

在十进制计数制中,r=10,基本符号为0,1,2,3....,9。

在二进制计数制中,r=2,基本符号为0,1。二进制数中的一个0或1称为1位(bit)。

在八进制计数制中,r=8,基本符号为0,1,2,3,4,5,6,7。

在十六进制计数制中,r=16,基本符号为0,1,2,3......9,A,B,C,D,E,F。

十进制数转二进制数时,整数部分和小数部分分别转换,然后在合并。十进制数整数部分转换二进制数的方法是【除以2取余】;十进制数小数部分转换二进制数的方法是【乘2取整】。

十进制转换成其他进制也是同理:十进制转化成r进制(r代表进制数)都是整数部分除以r取余,小数部分乘r取整。

示例:

把十进制数175.71875转换成二进制数:

整数部分:

扫描二维码关注公众号,回复: 14779554 查看本文章
算式 余数
175/2 87 1
87/2 43 1
43/2 21 1
21/2 10 1
10/2 5 0
5/2 2 1
2/2 1 0
1/2 0 1

 可以得到十进制的175等于二进制的10101111    (需要倒着看余数)

 小数部分(如果遇到始终乘以2之后始终得不到小数部分是0的结果则取值到一定精度即可):

算式 乘积
0.71875*2 1.43750
0.43750*2 0.8750
0.8750*2 1.750
1.750*2 1.5
0.5*2 0.1

 可以得到十进制的0.71875等于二进制的0.10111   (只需要看乘积的整数部分)

2.2、Java代码示例

十进制转换成其他(targetRadix)进制

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Test {
    public static void main(String[] args) {
        //十进制转换其他进制-----------------------------------------------
        //校验途径【进制数在线转换工具】:https://tool.oschina.net/hexconvert/
        //自己写代码:
        //超过10的表示符(目标进制数必须小于expressStr+10的个数,这里字母A到Z最多支持36进制(最少二进制))
        String[] expressStr=new String[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        //待转换的十进制数
        Double val=175.71875;
        //目标进制
        int targetRadix=2;
        if(targetRadix<2 || targetRadix>36){
            System.err.println("目标进制不正确");
            return;
        }
        BigDecimal bd = BigDecimal.valueOf(val);
        // 整数部分
        BigDecimal integerPart = bd.setScale(0, RoundingMode.DOWN);
        // 小数部分
        BigDecimal fractionalPart = bd.subtract(integerPart);
        System.out.println("整数部分:"+integerPart+",小数部分:"+fractionalPart);
        //---------------------------------开始将整数部分转化-----------------------------------
        //记录商
        BigDecimal quotient=integerPart;
        //记录余数
        BigDecimal remainder;
        String radixStr="";
        while(quotient.intValue()!=0){
            BigDecimal tempQuotient=BigDecimal.valueOf(quotient.intValue());
            //RoundingMode.DOWN防止除不尽的情况发生,直接取整
            quotient=tempQuotient.divide(BigDecimal.valueOf(targetRadix),RoundingMode.DOWN).setScale(0, RoundingMode.DOWN);
            remainder=tempQuotient.subtract(quotient.multiply(BigDecimal.valueOf(targetRadix)));
            String s="";
            if(remainder.intValue()>9){
                s=expressStr[remainder.intValue()-10];
            }else{
                s=remainder.toString();
            }
            radixStr+=s;

        }
        //整数部分需要将记录值倒置
        radixStr=new StringBuffer(radixStr).reverse().toString();

        //---------------------------------开始将小数部分转化-----------------------------------
        //记录小数部分
        BigDecimal productFractionalPart=BigDecimal.valueOf(fractionalPart.doubleValue());
        //记录乘radix之后的乘积
        BigDecimal product;
        //记录乘积之后的整数
        BigDecimal productIntPart;
        String radisStr2="";
        while(productFractionalPart.doubleValue()!=0){
            product=productFractionalPart.multiply(BigDecimal.valueOf(targetRadix));
            productIntPart=product.setScale(0, RoundingMode.DOWN);
            String s="";
            if(productIntPart.intValue()>9){
                s=expressStr[productIntPart.intValue()-10];
            }else{
                s=productIntPart.toString();
            }
            radisStr2+=s;
            productFractionalPart=product.subtract(productIntPart);
            //无限小数的情况保留9位的进制小数
            if(radisStr2.length()==9){
                break;
            }
        }
        String result=radixStr+(radisStr2.length()==0?"":"."+radisStr2);
        System.out.println("转换结果:"+result);
    }
}

3、二进制转化成其他进制

3.1、二进制转化成10进制

二进制转化10进制的方法是:将二进制数的每一位乘以它的权(权=2的n次幂,即 2^n),然后相加,即可求得对应的十进制数值。

科普一下:次幂又称乘方。表示一个数自乘若干次的形式,如a自乘n次的幂为a^n,或称a^n为a的n次幂。a称为幂的底数,n称为幂的指数(指数n也可以是正数、负数,也可以是任意实数或复数),任何非0数的0次幂都是1,0的0次幂无意义。

当n是负数时,相当于是a的n次幂取反,例:a^(-2)=1/(a^2)

示例:

把二进制数100110.101转化成十进制数。

100110.101        待转换二进制数

=1*2^5+0*2^4+0*2^3+1*2^2+1*2^1+0*2^0+1*2^(-1)+0*2^(-2)+1*2^(-3)          每一位数乘对应的权

=32+0+0+4+2+0+0.5+0+0.125                得到的数值相加

=38.625                        最后得到十进制数

3.2、二进制转化成8进制

二进制和八进制对应关系
二进制 八进制
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

二进制数转换成八进制数的方法是:从小数点起,每三位二进制位分成一组(不足三位时在小数点左边时左边补0,在小数点右边时右边补0),然后写出每一组的等值八进制数,顺序排列起来就得到所要求的八进制数了。

依照同样的思想,将一位八进制数用三位二进制数表示,就可以直接讲八进制数转换成二进制数。

示例:

将二进制数10101111.10111转换成八进制数

10101111.10111                       待转换二进制数

=010  101  111.101  110          按三个一组拆分

=257.56                                    得到八进制数

3.3、二进制转化成16进制

二进制和十六进制数之间的对应关系
二进制 十六进制 二进制 十六进制
0000 0 1000 8
0001 1 1001 9
0010 2 1010 A
0011 3 1011 B
0100 4 1100 C
0101 5 1101 D
0110 6 1110 E
0111 7 1111 F

由于一位十六进制数可以用4位二进制数表示,因此二进制数与十六进制数的相互转化就比较容易,和上述二进制转换八进制数类似,二进制数转换十六进制数的方法是:从小数点开始,每4位二进制数为一组(不4位时,在小数点左边时左边补0,在小数点右边时右边补0),将每一组用十六进制数符来表示,即可得到十六进制数。

示例:

将二进制数10101111.10111转化成十六进制数

10101111.10111                        待转换二进制数

=1010  1111.1011 1000             按每四位分组

=AF.B8                                       最终得到十六进制数

4、八进制转化成其他进制

4.1、八进制转换十进制

和二进制转换十进制原理相似:每一位数乘以8的n次幂,最后相加。

示例:将八进制的4357 转换为10进制,

4357.52                              待转换的八进制数

=4*8^3+3*8^2+5*8^1+7*8^0+5*8^(-1)+2*8^(-2)               每一位数乘以8的n次幂相加

=2048+192+40+7+0.625+0.03125                相加

=2287.65625                                得到结果

4.2、八进制转换十六进制

思路是先把八进制数转化成二进制数,再把二进制数转化成十六进制数。

5、十六进制转化成其他进制

5.1、十六进制数转换成十进制数

思路和八进制数转十进制数相似,和二进制数转十进制数也雷同:每一位数乘以16的n次幂,最后相加。

示例:将十六进制数8CE.9转换成十进制数

8CE.9                                待转换的十六进制数

=8*16^2+12*16^1+14*16^0+9*16^(-1)                    每一位数乘以16的n次幂相加  

=2048+192+14+0.5625                        相加

=2254.5625                        得到结果

5.2、十六进制转换成二进制

思路是:每一位十六进制数转化成对应的四位二进制数拼接起来。

示例:将十六进制数8CE.9转换成二进制数

8CE.9                待转换的十六进制数

=1000  1100  1110.1001               每一位十六进制数分别转换成四位二进制数

=100011001110.1001                        拼接成自后结果

5.3、十六进制转换成八进制

思路是:先转换成二进制在转换成八进制。

猜你喜欢

转载自blog.csdn.net/JohnGene/article/details/126359622