java任意进制转换

2023-05-16

摘要

我们日常常用的是十进制。

计算机是基于二进制的,计算机常用的还有十六进制、八进制。

本文主要介绍如何实现十进制和任意进制间转换。

计算思想

如果用:【0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ你我】分别代表数字。则A代表36,你代表62,我代表63.

1、任意进制转10进制。比如64进制:A你我,可分解为

A你我 = 我*1+你*64+A*64*64=63*1+62*64+36*64*64=151487;

2、10进制转任意进制。还是151487。

y=m*r^x = m0*1+m1*64+m2*64^2+m3*64*3+...mi*64^i=151487,我们需要计算出所有次幂x及对应的乘数m.

我们先算用算出它的最高次幂,x=log(151487)/log(64),取整为2,即最大次幂为2。

计算出对应乘数m2=151487/64^2,取整为36。

计算余数=151487对36*64^2取余数。

对余数分别再用上面的方法计算,即可获得所有的乘数和次幂。分别是:2次幂-36,1次幂-62,0次幂-63。 即结果为:36,62,63,对应字符串为:A你我。

注意:中间如果有某些次幂不存在,也需要补0作为乘数。如:5*64^5+3*64^1=5*64^5+0*64^4+0*64^3+0*64^2+3*64^1+0*64^0=500030

代码实现

任意进制转10进制:

    /**
     * 任意进制转换成十进制
     * @param num 要转换的任意进制数字
     * @param radix 当前要转换的数字进制
     * @param dict 目标进制数值和字符对应关系,如:0-0 a-10 z-35
     * @return
     */
    public static int radixConvert10(String num, int radix, Map<String, Integer> dict){
        String[] nums = num.split("");
        int result=0;
        for(int i=0; i<nums.length; i++){
            // y=m*r^x = m0*r^0+m1*r^1+m2*r^2+...+mi*r^i+...
            // 从后往前累加
            String mi_str = nums[nums.length-i-1];
            int mi=dict.get(mi_str);
            result += mi*Math.pow(radix,i);
        }
        return result;
    }

    /**
     * 任意进制转换成十进制
     * @param num 要转换的10进制数字
     * @param radix 目标进制
     * @param numberOrder 目标进制代替数字的字符串顺序,如:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
     * @return
     */
    public static int radixConvert10(String num, int radix, String numberOrder){
        String[] split = numberOrder.split("");
        Map<String, Integer> dict = new HashMap<>();
        //做字符串和数字的对应关系
        for(int i=0; i<split.length; i++){
            dict.put(split[i],i);
        }
        return radixConvert10(num, radix, dict);
    }

十进制转任意进制:

    /**
     * 十进制转换成任意进制
     * @param num 要转换的10进制数字
     * @param radix 目标进制
     * @param dict 目标进制数值和字符对应关系,如:0-0 10-a 35-z
     * @return
     */
    public static String radixConvert(int num, int radix, Map<Integer, String> dict){
        if(num<radix){
            //个位数,直接获取
            return dict.get(num);
        }
        int temp = num;
        int prex=0;
        List<Integer> ms = new ArrayList<>();
        while (temp>0){
            // 获取最大的幂, 如m*r^x
            int x = (int)(Math.log(temp) / Math.log(radix));
            // 获取该幂的乘数
            int m = (int)(temp / Math.pow(radix, x));
            // 如果前一次幂比后一次幂大超过1
            while (prex>x+1){
                ms.add(0);
                prex--;
            }
            prex=x;
            ms.add(m);
            // 取余,再循环进行下一次幂运算
            temp = temp % (m * (int)Math.pow(radix, (x)));
        }
        while (prex>0){
            ms.add(0);
            prex--;
        }
        StringBuilder sb = new StringBuilder();
        for(Integer m:ms){
            sb.append(dict.get(m));
        }
        return sb.toString();
    }

    /**
     * 十进制转换成任意进制
     * @param num 要转换的10进制数字
     * @param radix 目标进制
     * @param numberOrder 目标进制代替数字的字符串顺序,如:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
     * @return
     */
    public static String radixConvert(int num, int radix, String numberOrder){
        String[] split = numberOrder.split("");
        Map<Integer, String> dict = new HashMap<>();
        //做字符串和数字的对应关系
        for(int i=0; i<split.length; i++){
            dict.put(i,split[i]);
        }
        return radixConvert(num, radix, dict);
    }

测试:

    public static void main(String[] args) {
        String numberOrder = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ你我";
        String num="A你我";
        int n = radixConvert10(num, 64, numberOrder);
        System.out.println(num+"(64进制)="+n+"(10进制)");
        String s = radixConvert(n, 64, numberOrder);
        System.out.println(n+"(10进制)="+s+"(64进制)");
    }

运行结果:

A你我(64进制)=151487(10进制)
151487(10进制)=A你我(64进制)

暂不支持负数,负数可先去掉符号转成正数,然后再计算。任意进制转换的作用和意义,这里不作解释。

***********************************************************************************************
author:蓝何忠
email:lanhezhong@163.com
***********************************************************************************************

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java任意进制转换 的相关文章

  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void

随机推荐

  • round()函数的用法

    python中round 函数的用法 round a b a 需要进行四舍五入的数字 b 指定的位数 xff0c 按此位数进行四舍五入 注解 如果 b 大于 0 xff0c 则四舍五入到指定的小数位 如果 b 等于 0 xff0c 则四舍五
  • linux mysql 查看默认端口号和修改端口号

    如何查看mysql 默认端口号和修改端口号 2015 03 19 17 42 18 1 登录mysql root 64 test mysql u root p Enter password 2 使用命令show global variabl
  • netty 二进制简单通信

    环境 xff1a netty版本4 0 36Final jdk7 服务端 xff1a 1 App java package com mind core import com mind core net websocket server Ne
  • js 字符串转换成数字的三种方法, 取float型小数点后两位数的方法

    在js读取文本框或者其它表单数据的时候获得的值是字符串类型的 例如两个文本框a和b 如果获得a的value值为11 b的value值为9 那么a value要小于b value 因为他们都是字符串形式的 在网上找了一下js字符串转数字的文章
  • 二次贝塞尔曲线长度

    二次贝塞尔曲线通常以如下方式构建 xff0c 给定二维平面上的固定点P0 P1 P2 xff0c 用B t 表示该条曲线 用一个动画来演示 xff0c 可以更加清楚的表明这条曲线的构建过程 如果t变量本身线形变化的话 xff0c 这条贝塞尔
  • 损坏的主控文件表,CHKDSK被终止.如何恢复数据

    这种情况是分区结构出现异常 引起的分区错误 单击右键属性看到的是RAW格式 移动硬盘的话 xff0c 很大程度是因为强拔之类的操作 xff0c 也可能是坏道 病毒 xff0c 硬盘本身质量问题引起的 因为系统读取移动硬盘信息困难 xff0c
  • Microsoft SQL Server 2008 R2 官方简体中文正式版下载(附激活序列号密钥)

    微软官方发布的Microsoft SQL Server 2008 R2 简体中文完整版 基于SQL Server 2008提供可靠高效的智能数据平台构建而成 xff0c SQL Server 2008 R2 提供了大量新改进 xff0c 可
  • 不重装系统将系统移动到固态硬盘,并修改为C盘

    如今很多人升级电脑都会考虑换块固态硬盘 xff0c 如果重装系统 xff0c 又要重新安装一系列的软件 xff0c 拷贝一系列的数据 这里教大家怎样直接用固态硬盘代替C盘 xff0c 并且不会影响数据和软件 1 首先是在原电脑上加装新固态硬
  • python进行t检验示例

    t检验主要是针对正态总体均值的假设检验 xff0c 即检验样本的均值与某个值的差异 xff0c 或者两个样本的均值是否有差异等 其不需要事先知道总体的方差 xff0c 并且在少量样本情况下也可以进行检验 python进行t检验使用scipy
  • python-正态分布查表应用(scipy.stats.norm)

    1 公式 xff1a 正态分布概率密度公式 xff1a 可通过转换为标准正态分布 2 概率密度 xff1a 标准正态分布在某个点的概率密度可用scipy stats norm pdf计算 xff0c 下面模拟计算 5 5的概率密度 from
  • python-介绍泊松分布(poisson分布)

    一 泊松分布问题 xff1a 假设我每天接到骚扰电话的次数服从泊松分布 xff0c 并且经统计平均每天我会接到20个骚扰电话 请问 xff1a 1 我明天接到15个骚扰电话的概率 xff1f 2 我明天接到24个骚扰电话以下的概率 xff0
  • Word文档编辑技巧

    1 如何让附录显示在目录里 依次点击菜单栏的视图 工具栏 大纲 xff0c 打开大纲工具栏 选中 目录 附录 参考文献 等标题 xff0c 点击大纲工具栏的大纲级别的下拉选项 xff0c 选择 1级 xff0c 此时就完成了对 目录 等标题
  • 谈windows开发学习过程

    MFC作为一个C 43 43 类库 xff0c 而且MFC是Windows SDK的封装 为了开发windows应用更方便 xff0c 让程序员开发应用不需要过多在意细节 xff0c 专注功能上的开发 xff0c 所以推出MFC 但是实际开
  • python-指数分布介绍(scipy.stats.expon)

    一 指数分布问题 xff1a 有一种品牌的路由器 xff0c 据厂家统计知该路由器平均寿命是50000小时 xff0c 现在有2个问题 xff1a 1 去年我买了一个这样的路由器 xff0c 使用到现在已经8000小时了一点问题都没有 xf
  • python-使用LinearRegression进行简单线性拟合(线性回归)

    一元线性拟合 现有两组数据 xff0c 求y 61 a x 43 c的系数 X 61 12 46 0 25 5 22 11 3 6 81 4 59 0 66 14 53 15 49 14 43 2 19 1 35 10 02 12 93 5
  • matplotlib绘制双坐标轴(双纵轴)

    双坐标轴绘图示例 import matplotlib pyplot as plt import numpy as np plt rcParams 39 font sans serif 39 61 39 SimHei 39 用来正常显示中文标
  • pyplot画多个图,在一个图中绘制多个子图

    pyplot绘制多个子图方法 matplotlib在一个图中绘制多个子图用plt subplot 方法 import matplotlib pyplot as plt import numpy as np plt rcParams 39 f
  • mysql数据库备份及恢复

    1 mysql数据库备份 xff1a mysqldump lan db u root pmypassword h 10 49 56 01 gt data backup lan db sql 2 mysql数据库恢复 xff1a 先创建数据库
  • mysql密码过期解决办法,mysql密码永不过期

    1 进入到数据库服务器 xff0c windows需要进入到bin目录 xff0c linux应该是任意目录即可 xff08 但需要账号有权限 xff09 以windows为例 xff1a C Program Files MySQL MyS
  • java任意进制转换

    摘要 我们日常常用的是十进制 计算机是基于二进制的 xff0c 计算机常用的还有十六进制 八进制 本文主要介绍如何实现十进制和任意进制 间转换 计算思想 如果用 0123456789abcdefghijklmnopqrstuvwxyzABC