java基础【二】十六进制-Integer.MAX_VALUE (0x7fffffff)

【问题1】今天用到了random.nextInt(Integer.MAX_VALUE)的时候,由了一个疑惑,MAX_VALUE到底是多少?

@Native public static final int   MAX_VALUE = 0x7fffffff;

       【思路】

                0x7fffffff 中的【0x】表示这是个16进制数,这个之后的才是值。也就是【7fffffff 】才是16进制。

【问题2】接下来的问题就是如何将16进制转化成10进制。这个可以参考百度百科的【十六进制转换】。

方式一:16进制直接转化成10进制

  • 16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方。以此类推。
  • 所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。采用竖式计算
  • 这里是f就是15,7就是7.

写法一:为了便于理解,过程如下

第一位: f*16^0 = 15 

第二位: f*16^1 = 15 *16=‭240‬

第三位: f*16^2 = 15 *16^2=3840

第四位: f*16^3 = 15 *16^3 =61440

第五位: f*16^4 = 15 *16^4 =983040

第六位: f*16^5 = 15 *16^5 =15728640

第七位: f*16^6 = 15 *16^6 =251658240

第八位: 7*16^7 = 1879048192

所以转换之后的十进制=15 +240‬ +3840 +61440 +983040+15728640+251658240+1879048192=2147483647

写法二:简便的写法

15*(16^0+16^1+16^2+16^3+16^4+16^5+16^6)+7*16^7 = 15*((16^7-16^0)/15)+7*16^7 = 16^7 * (1+7) - 1 = 2147483647

方式二:16进制先转化为2进制,然后2进制转为10进制

第一步:16进制先转化为2进制

  • 16进制就有16个数,0~15,用二进制表示15的方法就是1111,从而可以推断出,16进制用2进制可以表现成0000~1111,顾名思义,也就是每四个2进制表示一个16进制。
  • 这是的16进制先转化为2进制方法就是一分四,即一个十六进制数分成四个二进制数,十六进制数通过除2取余法,得到二进制数
  • 对于我们这里的f,也就是15,二进制就是1111。对于我们这里的7,二进制就是0111。
  • 所以7fffffff 的2进制为:0111 1111 1111 1111 1111 1111 1111 1111

第二步:2进制转为10进制 

 把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。大概意思就是:就是把一个有X位的二进制数,从右        往左数,每一位依次乘以2的0次方,2的1次方,2的2次方,一直乘到2的X-1次方,然后把这些次方的结果加起来即可         得到最终一个十进制数的结果

所以0111 1111 1111 1111 1111 1111 1111 1111的十进制是:

         2^0+2^1+2^2+2^3+2^4+2^5+2^0+2^6……+2^30+0*2^31=(2^31-2^0) +0*2^31 = 2^31-1=2147483647.【也就是 2 的 31 次方 - 1】

你可能感兴趣的:(java基础)