我是架构师-基本类型-int

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. 可以挑战移位中得 负数,小数问题。

你可能感兴趣的:(java,int,java基本类型)