Integer 类在对象中包装了一个基本类型 int 的值。
取值范围:
Integer.MAX_VALUE = (2^31)-1;
Integer.MIN_VALUE = (-2^31);
一些方法:
method:bitCount(int i)
返回指定 int 值的二进制补码表示形式的 1 位的数量。此函数有时用于人口普查。
例如:
Integer.bitCount(9)
9是0000 0000 0000 1001
所以结果应该是2
method:highestOneBit(int i)
返回具有至多单个 1 位的 int 值,在指定的 int 值中最高位(最左边)的 1 位的位置。如果指定的值在其二进制补码表示形式中不具有 1 位,即它等于零,则返回零.
实现: 把按照当前最高位为1,后面的低位全部转换为1,然后无符号右移动一位(>>>),得到返回值。
见代码:
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >>16);
return i - (i >>>1);
所以如果是负数,结果都是-2147483648;
method:lowestOneBit(int i)
返回具有至多单个 1 位的 int 值,在指定的 int 值中最低位(最右边)的 1 位的位置。如果指定的值在其二进制补码表示形式中不具有 1 位,即它等于零,则返回零。
注:参考 highestOneBit
method:rotateLeft(int i, int distance)
返回根据指定的位数循环左移指定的 int 值的二进制补码表示形式而得到的值。(位是从左边(即高位)移出,从右边(即低位)再进入)
实现:(i << distance) | (i >>>-distance);
注意,使用负距离的左循环等同于右循环:
rotateLeft(val, -distance) == rotateRight(val, distance)。还要注意的是,以 32 的任何倍数进行的循环都是无操作指令,因此,即使距离为负,除了最后五位外,其余所有循环距离都可以忽略:rotateLeft(val, distance) == rotateLeft(val, distance & 0x1F)。
method:signum(int i)
返回指定 int 值的符号函数。(如果指定值为负,则返回 -1;如果指定值为零,则返回 0;如果指定的值为正,则返回 1。)
method:toString(int i)
静态方法
返回一个表示指定整数的 String 对象。将该参数转换为有符号的十进制表示形式,以字符串形式返回它,就好像将参数和基数 10 作为参数赋予toString(int, int) 方法。
注:这地方API有所偏差。
实际上jdk做了几个至少很优雅的地方:
1.if (i == Integer.MIN_VALUE)
return "-2147483648";
2. getChars(int i, int index, char[] buf) 中
if(i <=65536)
同时取值2位
// Generate two digits per iteration
注:实现方式值得学习
else
// 每次取值一位
注:q = (i * 52429) >>>(16+3);
网络上给出了各种讨论,
问题很简单:
公式如下:
int[] move = {18,19,20,21};
for(int i : move){
double d = Math.pow(2,i)
System.out.println(((int)d/10+1)/d);
}
out:
0.10000228881835938
0.10000038146972656
0.10000038146972656
0.10000038146972656
看到了, 移动19位已经足够了,再多也不能增大更多的精度。也不存在越界之说。
method:toString(int i, int radix)
静态方法
不多做解释了,简单说下:
1. 如果radix在2-36之外,按照10进制计算。
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
return toString(i);
2.用以下 ASCII 字符作为数字:
0123456789abcdefghijklmnopqrstuvwxyz
Integer.toString(411787,27).equal(“kona”)==true;
method:parseInt(String s, int radix)
不想多说,10进制就是取parseInt(s,10)
见例子:
parseInt("0", 10) 返回 0 parseInt("473", 10) 返回 473 parseInt("-0", 10) 返回 0 parseInt("-FF", 16) 返回 -255 parseInt("1100110", 2) 返回 102 parseInt("2147483647", 10) 返回 2147483647 parseInt("-2147483648", 10) 返回 -2147483648 parseInt("2147483648", 10) 抛出 NumberFormatException parseInt("99", 8) 抛出 NumberFormatException parseInt("Kona", 10) 抛出 NumberFormatException parseInt("Kona", 27) 返回 411787
method:valueOf(int i)
这个方法有其特点,见:
if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128];
可以好好研究下IntegerCache。
其他两个valueof没什么好说的。
method:
hashcode 返回int的值
compareTo 比较的是value ,不是对象
equals 比较的是value,不是对象
好了,依然做个小结:
1. 移位是一种很快的操作,左移移位,代表当前数值乘以2;
2. String解析数字,得到可能不仅仅是【0-9】;
3. 尽管valueof(String s)调用了parseInt,但是他有一些优势,就是容错能力,因为valueof里也接受int,这样能避免我们的意外错误
4. 记住我不遗余力的说明 hashcode,compareTo,equals这三个方法,相信很多高手明白其意义,但我简单仍然想简单说下,这3个方法在以后的容器类(Collection),比较接口(Comparator)等带来多大的意义。
5. 应该多了解Math,并且对数字敏感,了解更多的极限问题,比如
Integer.MAX_VALUE - Integer.MIN_VALUE 会是怎样的结果
6. 可以挑战移位中得 负数,小数问题。