首页 > 代码库 > 进制转换
进制转换
利用系统API
// 十进制-->其他进制System.out.println(Integer.toBinaryString(16));//2进制,10000System.out.println(Integer.toOctalString(16));//8进制,20System.out.println(Integer.toHexString(16));//16进制,10System.out.println(Integer.toString(16, 2));//可转化为任意进制,10000System.out.println("*******************************************");// 某进制的字符串-->十进制数System.out.println(Integer.parseInt("-06"));//-6,将十进制字符串转换为十进制数System.out.println(Integer.parseInt("-10", 2));//-2,将二进制字符串转换为十进制数System.out.println(Integer.parseInt("-10", 16));//-16,将16进制字符串转换为十进制数
10进制转16进制
/*** 将int类型10进制数转为16进制*/public static String toHex(int num) {if (num <= 9 && num >= 0) return num + "";// 查表法char[] chs = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ }; //长度为16char[] arr = new char[8];// 定义一个数组,存储16进制各个位上的字符,int为32位,2^32=16^8,所以只需8位即可int pos = arr.length;while (num != 0) {int temp = num & 15; //取2进制数的低4位,对应转化为16进制数的低1位,此16进制此位的值刚好对应数组chs里相应下标的元素的值arr[--pos] = chs[temp]; //将上述字符赋值给数组arr的最后一个元素num = num >>> 4; //无符号右移,取完之后右移4位,判断是否为0,不为0继续取直到为0}StringBuilder str = new StringBuilder();for (int x = pos; x < arr.length; x++) { // 高位的0不打印str.append(arr[x]);}str.append("\n");return str.toString();}
10进制转任意进制
/*** 将int类型10进制数转为其他进制,方法一* @param num 要转换的十进制数* @param base 要转换成的进制数,取值范围为[2,16]* @return 转换结果,为简化算法,以字符串格式输出*/public static String baseTran_1(int num, int base) {if (base > 16 || base < 2) throw new RuntimeException("不支持的进制数");if (num == 0 || base == 10) return num + "";char[] chs = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ };char[] arr = new char[32];//存储int类型数据,16进制需8位(16^8),2进制需32位(2^32)int pos = arr.length;//即32while (num != 0) {//假设num=45,offset=16int temp = num & (base - 1);//即 temp =0010-1101 & 1111 = 0000-1101 即 13arr[--pos] = chs[temp];//即 arr[31] = chs[13] = ‘D‘num = num >>> (int) Math.sqrt(base);//即 num = 0010}StringBuilder str = new StringBuilder("");for (int x = pos; x < arr.length; x++) {str.append(arr[x]);}return str.toString();}/*** 将int类型10进制数转为其他进制,方法二* @param num 要转换的十进制数* @param base 要转换成的进制数,取值范围为[2,16]* @return 转换结果,为简化算法,以字符串格式输出*/public static String baseTran_2(int num, int base) {if (base > 16 || base < 2) throw new RuntimeException("不支持的进制数");if (num == 0 || base == 10) return num + "";String digths = "0123456789ABCDEF";Stack<Character> s = new Stack<Character>();while (num != 0) {s.push(digths.charAt(num % base));num /= base;}StringBuffer str = new StringBuffer("");while (!s.isEmpty()) {str.append(s.pop());}return str.toString();}
任意进制转化为10进制
以下为Integer.parseInt(String paramString, int paramInt)的源码public static int parseInt(String paramString, int paramInt) throws NumberFormatException {if (paramString == null) throw new NumberFormatException("null");if (paramInt < 2) throw new NumberFormatException("radix " + paramInt + " less than Character.MIN_RADIX");if (paramInt > 36) throw new NumberFormatException("radix " + paramInt + " greater than Character.MAX_RADIX");int i = 0;int j = 0;int k = 0;int m = paramString.length();int n = -2147483647;if (m > 0) {int i3 = paramString.charAt(0);if (i3 < 48) {if (i3 == 45) {j = 1;n = Integer.MIN_VALUE;} else if (i3 != 43) throw new RuntimeException("失败");//其实是:throw NumberFormatException.forInputString(paramString);if (m == 1) throw new RuntimeException("失败");k++;}int i1 = n / paramInt;while (k < m) {int i2 = Character.digit(paramString.charAt(k++), paramInt);if (i2 < 0) throw new RuntimeException("失败");if (i < i1) throw new RuntimeException("失败");i *= paramInt;if (i < n + i2) throw new RuntimeException("失败");i -= i2;}} else throw new RuntimeException("失败");return j != 0 ? i : -i;}
byte[]和16进制字符串相互装换
public class Test {public static void main(String[] args) throws Exception {System.out.println(bytesToHexString(new byte[] { ‘\n‘, ‘1‘, ‘a‘ }));//0a-31-61System.out.println(Arrays.toString(hexStringToBytes("0a3161")));//[10, 49, 97]}/*** 将byte[]转换成16进制字符串形式*/public static String bytesToHexString(byte[] src) {if (src == null || src.length <= 0) return null;StringBuilder stringBuilder = new StringBuilder("");for (int i = 0; i < src.length; i++) {int v = src[i] & 0xFF;//将byte转换成int,这一步是核心代码String hv = Integer.toHexString(v);//把int转换成16进制的字符串if (hv.length() < 2) stringBuilder.append(0);stringBuilder.append(hv);if (i < src.length - 1) stringBuilder.append("-");}return stringBuilder.toString();}/*** 将16进制形式字符串转换成byte[]*/public static byte[] hexStringToBytes(String hexString) {if (hexString == null || hexString.equals("")) return null;hexString = hexString.toUpperCase();int length = hexString.length() / 2;char[] hexChars = hexString.toCharArray();byte[] d = new byte[length];for (int i = 0; i < length; i++) {int pos = i * 2;d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));}return d;}private static byte charToByte(char c) {return (byte) "0123456789ABCDEF".indexOf(c);//将2-16进制字符串中的char转换成byte}}
来自为知笔记(Wiz)
进制转换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。