java 实现N进制转M进制
1. 把10进制转成N进制:除N取余,逆序排列
这里逆序排列使用StringBuilder类的reverse()函数来实现。
- /**
- * 10进制整数转换为N进制整数。 10进制转换为N进制的方法是:这个10进制数除以N,求出余数,并把余数倒叙排列。 除N取余,倒叙排列
- * @param tenRadix
- * 十进制整数
- * @param radix
- * 要转换的进制数,例如,要转成2进制数,radix就传入2
- * @return radix进制的字符串
- */
- public static String string10ToN(int tenRadix, int radix)
- {
- // 进制编码支持9+26=35进制
- String code = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- StringBuilder buf = new StringBuilder();
- int remainder = 0;
- while (tenRadix != 0)
- {
- remainder = tenRadix % radix;// 求余数
- tenRadix = tenRadix / radix;// 除以基数
- buf.append(code.charAt(remainder));// 保存余数,记得要倒叙排列
- }
- buf.reverse();// 倒叙排列
- return buf.toString();
- }
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次幂的方法,这里用一个自定义的方法:
- /**
- * 返回x的ex次幂。
- * @param x
- * 底数
- * @param ex
- * 幂指数
- * @return x的ex次幂
- */
- public static int pow(int x, int ex)
- {
- int result = 1;
- for (int i = 0; i < ex; i++)
- {
- result *= x;
- }
- return result;
- }
当然也可以使用Math.pow()方法
下面是N进制转10进制的按权展开的方法:
- /**
- * 返回N进制对应的10进制数。
- *
- * @param N_num
- * N进制数
- * @param radix
- * N进制计数
- * @return N进制数对应的10进制数
- */
- public static int stringNTo10(String N_num, int radix)
- {
- StringBuilder stringBuilder = new StringBuilder(N_num);
- stringBuilder.reverse();// 反转字符,为了把权重最大的放在最右边,便于下面从左到右遍历,根据下标求权重。
- //如果不反转,从右向左遍历(从字符串下标大的一端)也可以
- char bitCh;
- int result = 0;
- for (int i = 0; i < stringBuilder.length(); i++)
- {
- bitCh = stringBuilder.charAt(i);
- if (bitCh >= '0' && bitCh <= '9')
- {
- // '0'对应的ASCII码整数:48
- result += (int) (bitCh - '0') * pow(radix, i);
- } else if (bitCh >= 'A' && bitCh <= 'Z')
- {
- // 减去'A'的ASCII码值(65),再加上10
- result += ((int) (bitCh - 'A') + 10) * pow(radix, i);
- } else if (bitCh >= 'a' && bitCh <= 'z')
- {
- // 减去'a'的ASCII码值(97),再加上10
- result += ((int) (bitCh - 'a') + 10) * pow(radix, i);
- }
- }
- return result;
- }
有了这两个核心的方法,其他的方法如十进制转2进制,十进制转8进制,十进制转16进制。N进制转M进制都可调用上面的两个方法来实现了:
3.N进制转M进制方法:
- /**
- * 把nRadix进制数nRadixNum转换为m进制数字符串并返回。
- * 具体做法是先把nRadix的nRadixNum转换成10进制数,然后再把这个10进制数转换成mRadix进制数。
- *
- * @param nRadixNum
- * n进制数
- * @param nRadix
- * n进制的基数
- * @param mRadix
- * 要转成的进制数基数m
- * @return m进制数字符串
- */
- public static String stringNToM(String nRadixNum, int nRadix, int mRadix)
- {
- return string10ToN(stringNTo10(nRadixNum, nRadix), mRadix);
- }
4.10进转2进制,10进制转8进制,10进制转16进制,调用十进制转N进制方法即可
- public static String string10To2(int tenRadixNum)
- {
- return string10ToN(tenRadixNum, 2);
- }
- public static String string10To8(int tenRadixNum)
- {
- return string10ToN(tenRadixNum, 8);
- }
- public static String string10To16(int tenRadixNum)
- {
- return string10ToN(tenRadixNum, 16);
- }
5.同理2进制转10进制,8进制转10进制,16进制转10进制,也只要调用N进制转10进制的方法即可,这里不再累赘。
6.整个代码:
- package lan.java.jinzhizhuanhuan;
- public class TheMoronicCowmpouter
- {
- public static void main(String[] args)
- {
- String HexNum = "f9";
- System.out.println(
- "16进制数:" + HexNum + "对应的2 进制数:" + stringNToM(HexNum, 16, 2));
- System.out.println(
- "16进制数:" + HexNum + "对应的10进制数:" + string16To10(HexNum));
- System.out.println(
- "16进制数:" + HexNum + "对应的32进制数:" + stringNToM(HexNum, 16, 32));
- }
- /**
- * 返回N进制对应的10进制数。
- *
- * @param N_num
- * N进制数
- * @param radix
- * N进制计数
- * @return N进制数对应的10进制数
- */
- public static int stringNTo10(String N_num, int radix)
- {
- StringBuilder stringBuilder = new StringBuilder(N_num);
- stringBuilder.reverse();// 反转字符
- char bitCh;
- int result = 0;
- for (int i = 0; i < stringBuilder.length(); i++)
- {
- bitCh = stringBuilder.charAt(i);
- if (bitCh >= '0' && bitCh <= '9')
- {
- // '0'对应的ASCII码整数:48
- result += (int) (bitCh - '0') * pow(radix, i);
- } else if (bitCh >= 'A' && bitCh <= 'Z')
- {
- // 减去'A'的ASCII码值(65),再加上10
- result += ((int) (bitCh - 'A') + 10) * pow(radix, i);
- } else if (bitCh >= 'a' && bitCh <= 'z')
- {
- // 减去'a'的ASCII码值(97),再加上10
- result += ((int) (bitCh - 'a') + 10) * pow(radix, i);
- }
- }
- return result;
- }
- public static int string2To10(String tenRadixNum)
- {
- return stringNTo10(tenRadixNum, 2);
- }
- public static int string8To10(String tenRadixNum)
- {
- return stringNTo10(tenRadixNum, 8);
- }
- public static int string16To10(String tenRadixNum)
- {
- return stringNTo10(tenRadixNum, 16);
- }
- /**
- * 返回x的ex次幂。
- *
- * @param x
- * 底数
- * @param ex
- * 幂指数
- * @return x的ex次幂
- */
- public static int pow(int x, int ex)
- {
- int result = 1;
- for (int i = 0; i < ex; i++)
- {
- result *= x;
- }
- return result;
- }
- /**
- * 10进制整数转换为N进制整数。 10进制转换为N进制的方法是:这个10进制数除以N,求出余数,并把余数倒叙排列。 除N取余,倒叙排列
- *
- * @param tenRadix
- * 十进制整数
- * @param radix
- * 要转换的进制数,例如,要转成2进制数,radix就传入2
- * @return radix进制的字符串
- */
- public static String string10ToN(int tenRadix, int radix)
- {
- // 进制编码支持9+26=35进制
- String code = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- StringBuilder buf = new StringBuilder();
- int remainder = 0;
- while (tenRadix != 0)
- {
- remainder = tenRadix % radix;// 求余数
- tenRadix = tenRadix / radix;// 除以2
- buf.append(code.charAt(remainder));// 保存余数,记得要倒叙排列
- }
- buf.reverse();// 倒叙排列
- return buf.toString();
- }
- public static String string10To2(int tenRadixNum)
- {
- return string10ToN(tenRadixNum, 2);
- }
- public static String string10To8(int tenRadixNum)
- {
- return string10ToN(tenRadixNum, 8);
- }
- public static String string10To16(int tenRadixNum)
- {
- return string10ToN(tenRadixNum, 16);
- }
- /**
- * 把nRadix进制数nRadixNum转换为m进制数字符串并返回。
- * 具体做法是先把nRadix的nRadixNum转换成10进制数,然后再把这个10进制数转换成mRadix进制数。
- *
- * @param nRadixNum
- * n进制数
- * @param nRadix
- * n进制的基数
- * @param mRadix
- * 要转成的进制数基数m
- * @return m进制数字符串
- */
- public static String stringNToM(String nRadixNum, int nRadix, int mRadix)
- {
- return string10ToN(stringNTo10(nRadixNum, nRadix), mRadix);
- }
- }
运行结果:
- 16进制数:f9对应的2 进制数:11111001
- 16进制数:f9对应的10进制数:249
- 16进制数:f9对应的32进制数:7P
这上面只支持到9+26=35进制以内的整数之间的进制相互转换,大于35进制的我不方便符号化就算了,知道进制转换的原理就行了,主要是10进制转N进制,以及N进制转10进制这两个重要的转换方法。
java 实现N进制转M进制的更多相关文章
- [置顶] JAVA概述(6)常量,关键字,进制转换
21.关键字.... 变量: 就是将不确定的数据进行存储.也就是需要在内粗恩中开辟一个空间. 整数类型 1个字节 byte 占 8位 -128~~~127 2 ...
- java 将数字转成成16进制
java 将数字转成成16进制 CreationTime--2018年6月11日17点11分 Author:Marydon 1.前提 数字必须是byte类型,即[-128,127] 2.代码实现 ...
- java中16进制转换10进制
java中16进制转换10进制 public static void main(String[] args) { String str = "04e1"; String myStr ...
- java程序练习:x进制转Y进制
/*X进制到Y进制转换*/ /*Step1.提示用户输入数据的进制X *Step2.接收用户输入的数据,保存到X * Scanner方法 *Step3.接收用户输入X进制的数据,保存到num *Ste ...
- 16进制转10进制 HDU-1720
A+B Coming Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【九度OJ】题目1208:10进制 VS 2进制 解题报告
[九度OJ]题目1208:10进制 VS 2进制 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1208 题目描述: 对于一 ...
- 16进制字符串和byte数组进行相互转换\将10进制转换为任意进制
16进制字符串和byte数组进行相互转换 简介 1个byte对应8个bit,16进制使用4个bit,所以一个byte转成16进制,占用两位. JAVA代码 private static final c ...
- C++ 中 int 转string, 以及10进制转2进制
感谢:http://blog.csdn.net/xiaofei2010/article/details/7434737 以及:http://www.cnblogs.com/nzbbody/p/3504 ...
- JS-011-颜色进制转换(RGB转16进制;16进制转RGB)
在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#0000 ...
- js用8421码实现10进制转2进制
今天早上突然心血来潮决定用 ''和js来撸一个进制转换.(纯属心血来潮,有兴趣的可以看看.) 我们知道,通过8421码.可以快速的得到一个10进制的2进制.如下图: 如上图所示:我们将10进制的 '1 ...
随机推荐
- 最受DBA欢迎的数据库技术文档-巡检篇
有人说,"数据库巡检是数据库运维领域最重要的工作".的确,为了保证数据库的稳定.安全运行,除了可以对数据库进行监控以及时知晓故障苗头,定期的"健康体检"则尤为重 ...
- 5. 介绍CSS层级
层级的大小使用 z-inde 来定义,层级大的会覆盖层级小的 : 举个例子,我们设计弹窗的时候,会涉及三个层面,我们把遮罩层mask放在第二层,把弹窗内容放在第一层 ,页面内容显示在第三层:
- Kubernetes 升级不弃 Docker:KubeKey 的丝滑之道
作者:尹珉,KubeSphere Ambaasador&Contributor,KubeSphere 社区用户委员会杭州站站长. 引言 随着 Kubernetes 社区的不断发展,即将迎来 K ...
- 一文读懂 Prometheus 长期存储主流方案
嘉宾 | 霍秉杰 整理 | 西京刀客 出品 | CSDN 云原生 Prometheus 作为云原生时代崛起的标志性项目,已经成为可观测领域的事实标准.Prometheus 是单实例不可扩展的,那么如果 ...
- MMdetection 问题报错 mmdet/evaluation/metrics/coco_metric.py data[‘category_id’] = self.cat_ids[label] IndexError: list index out of range
方案一:有人说 在自己定义的 conifg文件中增加 metainfo = { 'classes': ('class1','class2', 'class2',), 'palette': [ (220 ...
- Nuxt.js 应用中的 webpack:configResolved事件钩子
title: Nuxt.js 应用中的 webpack:configResolved事件钩子 date: 2024/11/21 updated: 2024/11/21 author: cmdragon ...
- 用MySQL5.7的客户端连接MySQL8.0的服务端竟然报错,不是说好向下兼容吗?
在默认条件下,用MySQL5.7的客户端连接MySQL8.0的服务端竟然报错,不是说好向下兼容吗? WHAT?报错如下:[root@node234 ~]# mysql -ushukuinfo -p'1 ...
- 通过jconsole查看tomcat运行情况的配置方法——基于JDK1.5、Linux(Redhat5.5)、Tomcat6
由于项目的原因,需要使用jconsole对tomcat进行远程监控,结合网上的资料对配置方法进行了总结. 第一步.配置tomcat 打开%TOMCAT_HOME%/bin下的文件catalina.sh ...
- 一个包含了 50+ C#/.NET编程技巧实战练习教程
DotNetExercises介绍 DotNetGuide专栏C#/.NET/.NET Core编程技巧练习集:C#/.NET/.NET Core编程常用语法.算法.技巧.中间件.类库.工作业务实操练 ...
- Golang框架之gin
gin是目前golang的主要web框架之一,之所以选择这个框架是因为其拥有高效的路由性能,并且有人长期维护,目前github上的star数已经破3W. [安装] go get -u github.c ...