进制转换

Posted 励志当个厨师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进制转换相关的知识,希望对你有一定的参考价值。

十进制转八进制

最近水题的时候水到一个题目,题目如下:

思路很简单,就是将对应的数字取余再除以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));
    }

 

以上是关于进制转换的主要内容,如果未能解决你的问题,请参考以下文章

在代码片段中包含类型转换

sql 日期转换代码片段 - Dato,120,konvertere

php初步

android.view.InflateException:二进制 XML 文件第 15 行:二进制 XML 文件第 19 行:膨胀类片段时出错

HTML Bookmarklet模板:将任何JavaScript代码片段转换为Bookmarklet

go语言怎么将二进制转为字符串