进制转换
十进制转八进制
最近水题的时候水到一个题目,题目如下:
思路很简单,就是将对应的数字取余再除以8,如此往复。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNextInt()) { decimalToOctal(scanner.nextInt()); } } private static void decimalToOctal(int num) { int radix = 8; //8进制 int result=0; int base = 1; while(num!=0) { int temp = num%radix; temp = temp*base; base *= 10; result += temp; num/=radix; } System.out.println(result); } }
通用解法
上面这种解法并不通用,只能转换为8进制,而且无法应付num是负数的情况比如-8, 其八进制根据原码、补码的规则应该是FFFFFFF8。后来想起java.lang.Integer中也有进制转换的函数,想看看JDK是如何实现进制转换的。 就这样发现了一个通用解法。
/** * All possible chars for representing a number as a String */ final static char[] digits = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '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' }; /** * Returns a string representation of the first argument in the * radix specified by the second argument. * * <p>If the radix is smaller than {@code Character.MIN_RADIX} * or larger than {@code Character.MAX_RADIX}, then the radix * {@code 10} is used instead. * * <p>If the first argument is negative, the first element of the * result is the ASCII minus character {@code '-'} * ({@code '\u005Cu002D'}). If the first argument is not * negative, no sign character appears in the result. * * <p>The remaining characters of the result represent the magnitude * of the first argument. If the magnitude is zero, it is * represented by a single zero character {@code '0'} * ({@code '\u005Cu0030'}); otherwise, the first character of * the representation of the magnitude will not be the zero * character. The following ASCII characters are used as digits: * * <blockquote> * {@code 0123456789abcdefghijklmnopqrstuvwxyz} * </blockquote> * * These are {@code '\u005Cu0030'} through * {@code '\u005Cu0039'} and {@code '\u005Cu0061'} through * {@code '\u005Cu007A'}. If {@code radix} is * <var>N</var>, then the first <var>N</var> of these characters * are used as radix-<var>N</var> digits in the order shown. Thus, * the digits for hexadecimal (radix 16) are * {@code 0123456789abcdef}. If uppercase letters are * desired, the {@link java.lang.String#toUpperCase()} method may * be called on the result: * * <blockquote> * {@code Integer.toString(n, 16).toUpperCase()} * </blockquote> * * @param i an integer to be converted to a string. * @param radix the radix to use in the string representation. * @return a string representation of the argument in the specified radix. * @see java.lang.Character#MAX_RADIX * @see java.lang.Character#MIN_RADIX */ public static String toString(int i, int radix) { // 参数验证,如果不和要求则转为十进制 // if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) radix = 10; // 如果是转为十进制就直接toString() // /* Use the faster version */ if (radix == 10) { return toString(i); } // 开始转换 // char buf[] = new char[33]; //用于构造最后的结果字符串 boolean negative = (i < 0); int charPos = 32; if (!negative) { //将正数转为负数,方便后面正负数统一处理 i = -i; } while (i <= -radix) { buf[charPos--] = digits[-(i % radix)]; i = i / radix; } buf[charPos] = digits[-i]; if (negative) { buf[--charPos] = '-'; } return new String(buf, charPos, (33 - charPos)); }