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


    1、常用进位数制

    常用的进位数制
    进位制二进制八进制十进制十六进制
    规则逢二进一逢八进一逢十进一逢十六进一
    基数r=2r=8r=10r=16
    数符0,10,1,2....,70,1,2....,90,1,2....,9,A,B,C....F
    2^i8^i10^i16^i
    形式表示符BODH

    可以看出,十进制的计数制中权的值是基数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/2871
    87/2431
    43/2211
    21/2101
    10/250
    5/221
    2/210
    1/201

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

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

    算式乘积
    0.71875*21.43750
    0.43750*20.8750
    0.8750*21.750
    1.750*21.5
    0.5*20.1

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

    2.2、Java代码示例

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

    1. import java.math.BigDecimal;
    2. import java.math.RoundingMode;
    3. public class Test {
    4. public static void main(String[] args) {
    5. //十进制转换其他进制-----------------------------------------------
    6. //校验途径【进制数在线转换工具】:https://tool.oschina.net/hexconvert/
    7. //自己写代码:
    8. //超过10的表示符(目标进制数必须小于expressStr+10的个数,这里字母A到Z最多支持36进制(最少二进制))
    9. 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"};
    10. //待转换的十进制数
    11. Double val=175.71875;
    12. //目标进制
    13. int targetRadix=2;
    14. if(targetRadix<2 || targetRadix>36){
    15. System.err.println("目标进制不正确");
    16. return;
    17. }
    18. BigDecimal bd = BigDecimal.valueOf(val);
    19. // 整数部分
    20. BigDecimal integerPart = bd.setScale(0, RoundingMode.DOWN);
    21. // 小数部分
    22. BigDecimal fractionalPart = bd.subtract(integerPart);
    23. System.out.println("整数部分:"+integerPart+",小数部分:"+fractionalPart);
    24. //---------------------------------开始将整数部分转化-----------------------------------
    25. //记录商
    26. BigDecimal quotient=integerPart;
    27. //记录余数
    28. BigDecimal remainder;
    29. String radixStr="";
    30. while(quotient.intValue()!=0){
    31. BigDecimal tempQuotient=BigDecimal.valueOf(quotient.intValue());
    32. //RoundingMode.DOWN防止除不尽的情况发生,直接取整
    33. quotient=tempQuotient.divide(BigDecimal.valueOf(targetRadix),RoundingMode.DOWN).setScale(0, RoundingMode.DOWN);
    34. remainder=tempQuotient.subtract(quotient.multiply(BigDecimal.valueOf(targetRadix)));
    35. String s="";
    36. if(remainder.intValue()>9){
    37. s=expressStr[remainder.intValue()-10];
    38. }else{
    39. s=remainder.toString();
    40. }
    41. radixStr+=s;
    42. }
    43. //整数部分需要将记录值倒置
    44. radixStr=new StringBuffer(radixStr).reverse().toString();
    45. //---------------------------------开始将小数部分转化-----------------------------------
    46. //记录小数部分
    47. BigDecimal productFractionalPart=BigDecimal.valueOf(fractionalPart.doubleValue());
    48. //记录乘radix之后的乘积
    49. BigDecimal product;
    50. //记录乘积之后的整数
    51. BigDecimal productIntPart;
    52. String radisStr2="";
    53. while(productFractionalPart.doubleValue()!=0){
    54. product=productFractionalPart.multiply(BigDecimal.valueOf(targetRadix));
    55. productIntPart=product.setScale(0, RoundingMode.DOWN);
    56. String s="";
    57. if(productIntPart.intValue()>9){
    58. s=expressStr[productIntPart.intValue()-10];
    59. }else{
    60. s=productIntPart.toString();
    61. }
    62. radisStr2+=s;
    63. productFractionalPart=product.subtract(productIntPart);
    64. //无限小数的情况保留9位的进制小数
    65. if(radisStr2.length()==9){
    66. break;
    67. }
    68. }
    69. String result=radixStr+(radisStr2.length()==0?"":"."+radisStr2);
    70. System.out.println("转换结果:"+result);
    71. }
    72. }

    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进制

    二进制和八进制对应关系
    二进制八进制
    0000
    0011
    0102
    0113
    1004
    1015
    1106
    1117

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

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

    示例:

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

    10101111.10111                       待转换二进制数

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

    =257.56                                    得到八进制数

    3.3、二进制转化成16进制

    二进制和十六进制数之间的对应关系
    二进制十六进制二进制十六进制
    0000010008
    0001110019
    001021010A
    001131011B
    010041100C
    010151101D
    011061110E
    011171111F

    由于一位十六进制数可以用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、十六进制转换成八进制

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

  • 相关阅读:
    v-model绑定input、textarea、checkbox、radio、select
    HTML5页面布局
    如何检查Apache Kafka服务运行状态
    技术干货分享:Kvaser Leaf的 D-SUB 9连接器DB9接头的引脚定义图,另附kvaser的多款怎么选型?
    6000字|22张图 带你彻底弄懂Zookeeper分布式锁
    SpringCloudAlibaba+Vue2.0搭建博客项目
    Spring 中毒太深!离开 Spring 我居然连最基本的接口都不会写了。。。
    第一个springBoot maven 项目
    IDEA快捷键(windows)
    【你不知道的javascript上】2. 第三章 全局作用域,函数作用域和块作用域,立即执行函数
  • 原文地址:https://blog.csdn.net/JohnGene/article/details/126359622