jdk阅读day2-Short&Long

1.Short

Short里面很多方法都是直接用的Integer的方法,可以说是缩小版的Integer了。(这个源码看完了)


2.Long

知识点:1.无符号数和有符号数

之前对无符号数和有符号数的概念很模糊,不清楚为什么要转换还有他们的区别。

无符号数:最高位为符号位。

有符号数:最高位为数值位。

有符号数转为无符号数:即把符号位当成数值位看待。

为什么数在进行比较前要先进行二者间的转化:如果为有符号数,则-127<128,但是如果把他们都转为无符号,则-127>128.

跳过(太复杂,看不懂):getChars(int,int,char[])、



没看懂:①toUnsignedString(int,int)

 public static String toUnsignedString(long i, int radix) {
        if (i >= 0)//问题1.为什么负数不丢进toString呢,toString也可以处理负数?因为tostring将负数看成有符号数。
            return toString(i, radix);
        else {
            switch (radix) {
            case 2:
                return toBinaryString(i);

            case 4:
                return toUnsignedString0(i, 2);

            case 8:
                return toOctalString(i);

            case 10:
                /*
                 * We can get the effect of an unsigned division by 10
                 * on a long value by first shifting right, yielding a
                 * positive value, and then dividing by 5.  This
                 * allows the last digit and preceding digits to be
                 * isolated more quickly than by an initial conversion
                 * to BigInteger.
                 */
                long quot = (i >>> 1) / 5;//上面那一段的意思好像是这样做的话会比作为bigInteger运算要快
                long rem = i - quot * 10;
                return toString(quot) + rem;

            case 16:
                return toHexString(i);

            case 32:
                return toUnsignedString0(i, 5);

            default:
                return toUnsignedBigInteger(i).toString(radix);
            }
        }
    }

② bitCount(long ) : 返回i对应的二进制中有几个1,如果i是负数,则返回负数对应的二进制补码中有几个1,当然,要有其相对应的返回值为long的函数。(没看懂下面的什么骚操作,反正最后就算出来了=  =)

     public static int bitCount(long i) {
        // HD, Figure 5-14
        i = i - ((i >>> 1) & 0x5555555555555555L);
        i = (i & 0x3333333333333333L) + ((i >>> 2) & 0x3333333333333333L);
        i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
        i = i + (i >>> 8);
        i = i + (i >>> 16);
        i = i + (i >>> 32);
        return (int)i & 0x7f;
     }

③public static long reverse(long):把对应的二进制补码反转过来,与②类似,都是一堆复杂的位运算。


2.toUnsignedBigIntger(long) 

    private static BigInteger toUnsignedBigInteger(long i) {
        if (i >= 0L) //正数的无符号数即为其本身
            return BigInteger.valueOf(i);
        else {//如果是负数,则是将符号位变成数值,所以要区别对待
            int upper = (int) (i >>> 32);//因为int只有32位,所以要分开高32和低32来算
            int lower = (int) i;//低32

            // return (upper << 32) + lower//再把他们合起来
            return (BigInteger.valueOf(Integer.toUnsignedLong(upper))).shiftLeft(32).
                add(BigInteger.valueOf(Integer.toUnsignedLong(lower)));
        }
    }

3.lowestOneBit(long)

    public static long lowestOneBit(long i) {
        // HD, Section 2-1
        return i & -i;
    }

觉得这个运算很神奇,于是记录一下:

由于计算机里正整数是以原码形式存储,负正数是以补码形式存储。但是正整数的原码和补码一样,姑且可以认为都是以补码形式存储的。我们再看一下正负数的补码和原码的转换:

正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

    [+1] = [00000001]原 = [00000001]反 = [00000001]补

    [-1] = [10000001]原 = [11111110]反 = [11111111]补

因此可知,作&运算后,得到的的确是最低位。


4.numberOfLeadingZeros(long i)

   public static int numberOfLeadingZeros(long i) {
        // HD, Figure 5-6
         if (i == 0)
            return 64;
        int n = 1;
        int x = (int)(i >>> 32);//高三十二位
        if (x == 0) { n += 32; x = (int)i; }//如果高32都为0 则在低32,下面开始是二分查找的思想
        if (x >>> 16 == 0) { n += 16; x <<= 16; }
        if (x >>> 24 == 0) { n +=  8; x <<=  8; }
        if (x >>> 28 == 0) { n +=  4; x <<=  4; }
        if (x >>> 30 == 0) { n +=  2; x <<=  2; }
        n -= x >>> 31;
        return n;
    }

5.reverse(long) 和 reverseByte(long ) :

reverse(long) 是指以位为单位的反转;而reverseBytes(long)是以字节为单位的反转。

猜你喜欢

转载自blog.csdn.net/lianup/article/details/79768065