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)是以字节为单位的反转。