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转换成二进制数:
整数部分:
算式 | 商 | 余数 |
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) {
//十进制转换其他进制-----------------------------------------------
//校验途径【进制数在线转换工具】:
//自己写代码:
//超过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、十六进制转换成八进制
思路是:先转换成二进制在转换成八进制。