Loading

IntegerToBinaryString

IntegerToBinaryString

方法写的非常的巧妙;佩服佩服!

 

package com.stono.jdk;

public class IntegerToBinaryString {
    public static void main(String[] args) {
        
        integerToBinaryString(); // jdk中的方法,调用toUnsignedString方法
        step1(); // 1<< shift 
        string(); // string构造函数
        integerToHexString(); // jdk中的方法,调用toUnsignedString方法
        integerToUnsignedString(); // jdk中的方法,Integer中的,但是是私有的,最多还可以计算一下32进制的数字;
    }
    
    private static void integerToUnsignedString() {
        int i = 2100000000; // 输入:需要转换的数字
        i = 31;
        i = 63;
        int shift = 5; // 输入:移位数量, 如果是5,那么就是32进制了;
        // shift = 6; // 如果是6,那么就是64进制了; digits没有这么多位数;
        System.out.println("digits.length: "+digits.length); // 最多也就是36位了;
        
        char[] buf = new char[32]; // 最多是32位,如果计算16进制就用不了那么多位数了;
        int charPos = 32;
        int radix = 1 << shift;
        int mask = radix - 1;
        System.out.println("mask:" + Integer.toBinaryString(mask));
        do {
            buf[--charPos] = digits[i & mask]; // 从数组的最后一位开始赋值,这样就可以形成正常的字符串
            i >>>= shift; // 无符号右移
        } while (i != 0);

        String stringReturn = new String(buf, charPos, (32 - charPos)); // string的一种构造方法
        System.out.println("charPos: "+charPos);
        System.out.println(buf);
        System.out.println(stringReturn);
    }

    private static void integerToHexString() {
        int i = 2100000000; // 输入:需要转换的数字
        i = 11;
        int shift = 4; // 输入:移位数量,Hex是十六进制,这样就可以四个四个的计算
        
        char[] buf = new char[32]; // 最多是32位,如果计算16进制就用不了那么多位数了;
        int charPos = 32;
        int radix = 1 << shift;
        int mask = radix - 1;
        System.out.println("mask:" + Integer.toBinaryString(mask));
        do {
            buf[--charPos] = digits[i & mask]; // 从数组的最后一位开始赋值,这样就可以形成正常的字符串
            i >>>= shift; // 无符号右移
        } while (i != 0);

        String stringReturn = new String(buf, charPos, (32 - charPos)); // string的一种构造方法
        System.out.println("charPos: "+charPos);
        System.out.println(buf);
        System.out.println(stringReturn);
    }

    private static void string() {
        String string = new String(digits,0,3); // string构造函数,从0开始,3个元素
        System.out.println(string);
        /** The value is used for character storage. */
        // private final char value[];
        // 字符串中就是使用char数组来存储字符串内容的;
        // 这种构造函数用到了Arrays.copyOfRange,里面用到了System.arraycopy,这是个native方法
    }

    private static void step1() {
        int shift = 1;
        int radix = 1<<shift; // 把1左移一位
        System.out.println(radix);
        int mask = radix - 1; // 再减去1,
        System.out.println(mask);
        shift = 2;
        radix = 1<<shift; // 如果shift是2,左移两位
        System.out.println(radix);
        mask = radix - 1; // 再减去1,
        System.out.println(mask);
        // 这样把shift位数的都填上1;
    }

    // jdk中的方法
    private static void integerToBinaryString() {
        int i = 2100000000; // 输入:需要转换的数字
        i = 1;
        int shift = 1; // 输入:移位数量
        
        char[] buf = new char[32];
        int charPos = 32;
        int radix = 1 << shift;
        int mask = radix - 1;
        do {
            buf[--charPos] = digits[i & mask]; // 从数组的最后一位开始赋值,这样就可以形成正常的字符串
            i >>>= shift;
        } while (i != 0);

        String stringReturn = new String(buf, charPos, (32 - charPos)); // string的一种构造方法
        System.out.println("charPos: "+charPos);
        System.out.println(buf);
        System.out.println(stringReturn);
        System.out.println(Integer.toBinaryString(-1));
        
    }
    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'
            };
}

 

posted @ 2018-01-06 08:52  stono  阅读(984)  评论(0编辑  收藏  举报