1. 把10进制转成N进制:除N取余,逆序排列

这里逆序排列使用StringBuilder类的reverse()函数来实现。

  1.  
    /**
  2.  
     * 10进制整数转换为N进制整数。 10进制转换为N进制的方法是:这个10进制数除以N,求出余数,并把余数倒叙排列。 除N取余,倒叙排列
  3.  
     * @param tenRadix
  4.  
     *            十进制整数
  5.  
     * @param radix
  6.  
     *            要转换的进制数,例如,要转成2进制数,radix就传入2
  7.  
     * @return radix进制的字符串
  8.  
     */
  9.  
    public static String string10ToN(int tenRadix, int radix)
  10.  
    {
  11.  
        // 进制编码支持9+26=35进制
  12.  
        String code = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  13.  
        StringBuilder buf = new StringBuilder();
  14.  
        int remainder = 0;
  15.  
        while (tenRadix != 0)
  16.  
        {
  17.  
            remainder = tenRadix % radix;// 求余数
  18.  
            tenRadix = tenRadix / radix;// 除以基数
  19.  
            buf.append(code.charAt(remainder));// 保存余数,记得要倒叙排列
  20.  
        }
  21.  
        buf.reverse();// 倒叙排列
  22.  
        return buf.toString();
  23.  
    }

2.把N进制数转成10进制数:按权展开

(1)这里的权就是N的ex次幂,例如2进制:1110=1*2^3+1*2^2+1*2^1+0*2^0 =8+4+2+0=14

所以这里需要一个求x的ex次幂的方法,这里用一个自定义的方法:

  1.  
    /**
  2.  
    * 返回x的ex次幂。
  3.  
    * @param x
  4.  
    * 底数
  5.  
    * @param ex
  6.  
    * 幂指数
  7.  
    * @return x的ex次幂
  8.  
    */
  9.  
    public static int pow(int x, int ex)
  10.  
    {
  11.  
    int result = 1;
  12.  
    for (int i = 0; i < ex; i++)
  13.  
    {
  14.  
    result *= x;
  15.  
    }
  16.  
    return result;
  17.  
    }

当然也可以使用Math.pow()方法

下面是N进制转10进制的按权展开的方法:

  1.  
    /**
  2.  
     * 返回N进制对应的10进制数。
  3.  
     *
  4.  
     * @param N_num
  5.  
     *            N进制数
  6.  
     * @param radix
  7.  
     *            N进制计数
  8.  
     * @return N进制数对应的10进制数
  9.  
     */
  10.  
    public static int stringNTo10(String N_num, int radix)
  11.  
    {
  12.  
        StringBuilder stringBuilder = new StringBuilder(N_num);
  13.  
        stringBuilder.reverse();// 反转字符,为了把权重最大的放在最右边,便于下面从左到右遍历,根据下标求权重。
  14.  
        //如果不反转,从右向左遍历(从字符串下标大的一端)也可以
  15.  
        char bitCh;
  16.  
        int result = 0;
  17.  
        for (int i = 0; i < stringBuilder.length(); i++)
  18.  
        {
  19.  
            bitCh = stringBuilder.charAt(i);
  20.  
            if (bitCh >= '0' && bitCh <= '9')
  21.  
            {
  22.  
                // '0'对应的ASCII码整数:48
  23.  
                result += (int) (bitCh - '0') * pow(radix, i);
  24.  
            } else if (bitCh >= 'A' && bitCh <= 'Z')
  25.  
            {
  26.  
                // 减去'A'的ASCII码值(65),再加上10
  27.  
                result += ((int) (bitCh - 'A') + 10) * pow(radix, i);
  28.  
            } else if (bitCh >= 'a' && bitCh <= 'z')
  29.  
            {
  30.  
                // 减去'a'的ASCII码值(97),再加上10
  31.  
                result += ((int) (bitCh - 'a') + 10) * pow(radix, i);
  32.  
            }
  33.  
        }
  34.  
        return result;
  35.  
    }

有了这两个核心的方法,其他的方法如十进制转2进制,十进制转8进制,十进制转16进制。N进制转M进制都可调用上面的两个方法来实现了:

3.N进制转M进制方法:

  1.  
    /**
  2.  
     * 把nRadix进制数nRadixNum转换为m进制数字符串并返回。
  3.  
     * 具体做法是先把nRadix的nRadixNum转换成10进制数,然后再把这个10进制数转换成mRadix进制数。
  4.  
     *
  5.  
     * @param nRadixNum
  6.  
     *            n进制数
  7.  
     * @param nRadix
  8.  
     *            n进制的基数
  9.  
     * @param mRadix
  10.  
     *            要转成的进制数基数m
  11.  
     * @return m进制数字符串
  12.  
     */
  13.  
    public static String stringNToM(String nRadixNum, int nRadix, int mRadix)
  14.  
    {
  15.  
        return string10ToN(stringNTo10(nRadixNum, nRadix), mRadix);
  16.  
    }

4.10进转2进制,10进制转8进制,10进制转16进制,调用十进制转N进制方法即可

  1.  
    public static String string10To2(int tenRadixNum)
  2.  
    {
  3.  
    return string10ToN(tenRadixNum, 2);
  4.  
    }
  5.  
    public static String string10To8(int tenRadixNum)
  6.  
    {
  7.  
    return string10ToN(tenRadixNum, 8);
  8.  
    }
  9.  
    public static String string10To16(int tenRadixNum)
  10.  
    {
  11.  
    return string10ToN(tenRadixNum, 16);
  12.  
    }

5.同理2进制转10进制,8进制转10进制,16进制转10进制,也只要调用N进制转10进制的方法即可,这里不再累赘。

6.整个代码:

  1.  
    package lan.java.jinzhizhuanhuan;
  2.  
     
  3.  
    public class TheMoronicCowmpouter
  4.  
    {
  5.  
    public static void main(String[] args)
  6.  
    {
  7.  
    String HexNum = "f9";
  8.  
    System.out.println(
  9.  
    "16进制数:" + HexNum + "对应的2 进制数:" + stringNToM(HexNum, 16, 2));
  10.  
    System.out.println(
  11.  
    "16进制数:" + HexNum + "对应的10进制数:" + string16To10(HexNum));
  12.  
    System.out.println(
  13.  
    "16进制数:" + HexNum + "对应的32进制数:" + stringNToM(HexNum, 16, 32));
  14.  
    }
  15.  
    /**
  16.  
    * 返回N进制对应的10进制数。
  17.  
    *
  18.  
    * @param N_num
  19.  
    * N进制数
  20.  
    * @param radix
  21.  
    * N进制计数
  22.  
    * @return N进制数对应的10进制数
  23.  
    */
  24.  
    public static int stringNTo10(String N_num, int radix)
  25.  
    {
  26.  
    StringBuilder stringBuilder = new StringBuilder(N_num);
  27.  
    stringBuilder.reverse();// 反转字符
  28.  
    char bitCh;
  29.  
    int result = 0;
  30.  
    for (int i = 0; i < stringBuilder.length(); i++)
  31.  
    {
  32.  
    bitCh = stringBuilder.charAt(i);
  33.  
    if (bitCh >= '0' && bitCh <= '9')
  34.  
    {
  35.  
    // '0'对应的ASCII码整数:48
  36.  
    result += (int) (bitCh - '0') * pow(radix, i);
  37.  
    } else if (bitCh >= 'A' && bitCh <= 'Z')
  38.  
    {
  39.  
    // 减去'A'的ASCII码值(65),再加上10
  40.  
    result += ((int) (bitCh - 'A') + 10) * pow(radix, i);
  41.  
    } else if (bitCh >= 'a' && bitCh <= 'z')
  42.  
    {
  43.  
    // 减去'a'的ASCII码值(97),再加上10
  44.  
    result += ((int) (bitCh - 'a') + 10) * pow(radix, i);
  45.  
    }
  46.  
    }
  47.  
    return result;
  48.  
    }
  49.  
    public static int string2To10(String tenRadixNum)
  50.  
    {
  51.  
    return stringNTo10(tenRadixNum, 2);
  52.  
    }
  53.  
    public static int string8To10(String tenRadixNum)
  54.  
    {
  55.  
    return stringNTo10(tenRadixNum, 8);
  56.  
    }
  57.  
    public static int string16To10(String tenRadixNum)
  58.  
    {
  59.  
    return stringNTo10(tenRadixNum, 16);
  60.  
    }
  61.  
    /**
  62.  
    * 返回x的ex次幂。
  63.  
    *
  64.  
    * @param x
  65.  
    * 底数
  66.  
    * @param ex
  67.  
    * 幂指数
  68.  
    * @return x的ex次幂
  69.  
    */
  70.  
    public static int pow(int x, int ex)
  71.  
    {
  72.  
    int result = 1;
  73.  
    for (int i = 0; i < ex; i++)
  74.  
    {
  75.  
    result *= x;
  76.  
    }
  77.  
    return result;
  78.  
    }
  79.  
    /**
  80.  
    * 10进制整数转换为N进制整数。 10进制转换为N进制的方法是:这个10进制数除以N,求出余数,并把余数倒叙排列。 除N取余,倒叙排列
  81.  
    *
  82.  
    * @param tenRadix
  83.  
    * 十进制整数
  84.  
    * @param radix
  85.  
    * 要转换的进制数,例如,要转成2进制数,radix就传入2
  86.  
    * @return radix进制的字符串
  87.  
    */
  88.  
    public static String string10ToN(int tenRadix, int radix)
  89.  
    {
  90.  
    // 进制编码支持9+26=35进制
  91.  
    String code = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  92.  
    StringBuilder buf = new StringBuilder();
  93.  
    int remainder = 0;
  94.  
    while (tenRadix != 0)
  95.  
    {
  96.  
    remainder = tenRadix % radix;// 求余数
  97.  
    tenRadix = tenRadix / radix;// 除以2
  98.  
    buf.append(code.charAt(remainder));// 保存余数,记得要倒叙排列
  99.  
    }
  100.  
    buf.reverse();// 倒叙排列
  101.  
    return buf.toString();
  102.  
    }
  103.  
    public static String string10To2(int tenRadixNum)
  104.  
    {
  105.  
    return string10ToN(tenRadixNum, 2);
  106.  
    }
  107.  
    public static String string10To8(int tenRadixNum)
  108.  
    {
  109.  
    return string10ToN(tenRadixNum, 8);
  110.  
    }
  111.  
    public static String string10To16(int tenRadixNum)
  112.  
    {
  113.  
    return string10ToN(tenRadixNum, 16);
  114.  
    }
  115.  
    /**
  116.  
    * 把nRadix进制数nRadixNum转换为m进制数字符串并返回。
  117.  
    * 具体做法是先把nRadix的nRadixNum转换成10进制数,然后再把这个10进制数转换成mRadix进制数。
  118.  
    *
  119.  
    * @param nRadixNum
  120.  
    * n进制数
  121.  
    * @param nRadix
  122.  
    * n进制的基数
  123.  
    * @param mRadix
  124.  
    * 要转成的进制数基数m
  125.  
    * @return m进制数字符串
  126.  
    */
  127.  
    public static String stringNToM(String nRadixNum, int nRadix, int mRadix)
  128.  
    {
  129.  
    return string10ToN(stringNTo10(nRadixNum, nRadix), mRadix);
  130.  
    }
  131.  
    }

运行结果:

  1.  
    16进制数:f9对应的2 进制数:11111001
  2.  
    16进制数:f9对应的10进制数:249
  3.  
    16进制数:f9对应的32进制数:7P

这上面只支持到9+26=35进制以内的整数之间的进制相互转换,大于35进制的我不方便符号化就算了,知道进制转换的原理就行了,主要是10进制转N进制,以及N进制转10进制这两个重要的转换方法。

java 实现N进制转M进制的更多相关文章

  1. [置顶] JAVA概述(6)常量,关键字,进制转换

    21.关键字.... 变量: 就是将不确定的数据进行存储.也就是需要在内粗恩中开辟一个空间. 整数类型   1个字节 byte                    占 8位 -128~~~127 2 ...

  2. java 将数字转成成16进制

      java 将数字转成成16进制 CreationTime--2018年6月11日17点11分 Author:Marydon 1.前提 数字必须是byte类型,即[-128,127] 2.代码实现 ...

  3. java中16进制转换10进制

    java中16进制转换10进制 public static void main(String[] args) { String str = "04e1"; String myStr ...

  4. java程序练习:x进制转Y进制

    /*X进制到Y进制转换*/ /*Step1.提示用户输入数据的进制X *Step2.接收用户输入的数据,保存到X * Scanner方法 *Step3.接收用户输入X进制的数据,保存到num *Ste ...

  5. 16进制转10进制 HDU-1720

    A+B Coming Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 【九度OJ】题目1208:10进制 VS 2进制 解题报告

    [九度OJ]题目1208:10进制 VS 2进制 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1208 题目描述: 对于一 ...

  7. 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制

    16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...

  8. C++ 中 int 转string, 以及10进制转2进制

    感谢:http://blog.csdn.net/xiaofei2010/article/details/7434737 以及:http://www.cnblogs.com/nzbbody/p/3504 ...

  9. JS-011-颜色进制转换(RGB转16进制;16进制转RGB)

    在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#0000 ...

  10. js用8421码实现10进制转2进制

    今天早上突然心血来潮决定用 ''和js来撸一个进制转换.(纯属心血来潮,有兴趣的可以看看.) 我们知道,通过8421码.可以快速的得到一个10进制的2进制.如下图: 如上图所示:我们将10进制的 '1 ...

随机推荐

  1. 墨天轮访谈 | 百度云邱学达:GaiaDB如何解决云上场景的业务需求?

    分享嘉宾:邱学达 百度云原生数据库资深技术专家 整理:墨天轮社区 导读 业务上云的大背景对弹性与可靠性的要求越来越高,传统架构的单机数据库或是分片数据库已经很难支撑快速增长的业务,导致单机瓶颈.扩容缩 ...

  2. 10 Self-Attention(自注意力机制)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  3. 云原生周刊 | 在 Grafana 中显示 K8s Service 之间的依赖关系

    开源项目推荐 Caretta 这个项目可以在 Grafana 监控面板中显示 K8s Service 之间的依赖关系.底层使用的是 eBPF,对应用无侵入. busuanzi 这是一个基于 Golan ...

  4. att&ck框架学习笔记3

    https://blog.csdn.net/m0_38103658/article/details/106517758?utm_medium=distribute.pc_relevant.none-t ...

  5. centos7LDAP服务搭建

    ladp服务搭建 用户名:cn=admin,dc=test,dc=com 密码:123456 1)软件安装yum install openldap openldap-clients openldap- ...

  6. 一文彻底弄懂Spring IOC 依赖注入

    Spring IOC(Inversion of Control,控制反转)依赖注入是 Spring 框架的核心特性之一,旨在实现对象之间的松耦合,提升代码的可维护性.可测试性和可扩展性.下面我们将从以 ...

  7. .NET周刊【11月第1期 2024-11-03】

    国内文章 .NET 9 AOT的突破 - 支持老旧Win7与XP环境 https://www.cnblogs.com/lsq6/p/18519287 .NET 9 引入了 AOT 支持,使得应用程序能 ...

  8. 推荐一个Star超过2K的.Net轻量级的CMS开源项目

    推荐一个具有模块化和可扩展的架构的CMS开源项目. 01 项目简介 Piranha CMS是一个轻量级且跨平台的CMS库,专为.NET 8设计. 该项目提供多种模板,具备CMS基本功能,也有空模板方便 ...

  9. ThreeJs-03材质进阶

    一.uv贴图 在3D计算机图形学中,UV映射是一种将2D纹理映射到3D模型表面的方法.在这里,"U"和"V"代表了2D纹理空间的坐标,这与2D笛卡尔坐标系统中的 ...

  10. vue在组件中实现双向绑定

    父组件中的一个变量和子组件的input框实现双向绑定,就要用到下面的方法: 父组件: <script> import CustomInput from './CustomInput.vue ...