`
天使的左手
  • 浏览: 54326 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

进制转换和移位操作(移位-1)

    博客分类:
  • java
阅读更多
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'
    };

/**
     * 进制转换(查表法)
     * @param 待转换的10进制数
     * @param shift 每次移位数
     * @return 转换为对应进制的字符串
     */
    static String trans(long i, int shift) {
        char[] chs = new char[64]; //long类型数据占64个字节,定义一个一样大小的字符数组
        int pos = 64;  //因为每次都是移掉最后的shift位,
                       //所以查到的字符也是从字符数组最后一个位置开始存储
        int radix = 1 << shift; //基数 比如十进制转二进制shift为1 得到的基数是2 其他进制类推
        int mask = radix - 1; //掩码 为基数-1
                              //比如十进制(15)转八进制 每次将待转的十进制数(15)向右移掉3位
                              //八进制对应的基数是8 掩码是7
                              //第一次(二进制表示15)
                              //15: 1111
                              // 7:  111 掩码
                              //     111 查表得 '7'
                              //向右移掉3位,得到1
                              //第二次:
                              //1: 001
                              //7: 111
                              //     1 查表得 '1'
                              //此时结束循环 得到最终的结果"17"
        do {
            chs[--pos] = digits[(int)(i & mask)];
            i >>>= shift;
        } while(i != 0); //当前结果不为0 循环继续
        
        return new String(chs, pos, 64-pos);
    }
    

    //这也是将十进制转为2进制的一种方法
    public static void toBinary(long val) {
        long x = val / 2;
        long y = val % 2;
        if(x != 0)
            toBinary(x);
        System.out.print(y);
    }
    
    //十进制转2进制 每次移动1位
    public static String toBinaryString(long l) {
        return trans(l, 1);
    }
    
    //十进制转8进制 每次移动3位
    public static String toOctalString(long l) {
        return trans(l, 3);
    }
    
    //十进制转16进制 每次移动4位
    public static String toHexString(long l) {
        return trans(l, 4);
    }
    
    
    /**
     * -1 >>> -1
     * -1向右移位(无符号)-1结果?
     * 
     * -1 >>> 31
     * -1向右移位(无符号)31 结果是1
     * 
     * -1 >>> 32
     *  计算过程
     *  32 & 31 = 0 向右移动0位 结果仍为-1
     *  
     *  -1 >>> -1
     *  -1 & 31 = 31 向右移动31位 结果为1
     */
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics