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