Integer.toHexString()这个方法是将byte字节转换为String,下图的b[n]&0XFF必须转化成一个int类型的
一个byte在计算机中二进制只有8位,而int是32位的,我们将一个正数由8位转化成32位很简单:
就是它的原码再补上24个0,还是原码,如+5;
byte在二进制中:0000 0101,
int是将原码补零:0000 0000 0000 0000 0000 0000 0000 0101。
但如果它是一个负数呢 比如-5,我们在计算机组成原理中定义负数的二进制是其相反数的补码,那什么是补码呢,补码就是原码的反码+1,反码就是原码取反。
这时候又有人为什么负数要用原码的补码表示呢,这里我们就要引入一个数学概念->模数,它表达的是计量数的容量,
举个栗子就很容易理解了,钟表模数是12,当我们时针转完一圈时,它又要从1开始计算。和我们二进制,十进制,是一个道理。
假设现在是7点,我们要将时针调到3点,我们有两种办法,一种是将时针顺时针转8,或者逆时针转4.所以在模数的概念下:
7 - 4 = 7 + 8,这个差就是模****,4和8就互为补数 。这里推广开来就是:A-B或A+(-B)= A+B(补) ,这样就可以将负数转化为正数来进行运算,同样的道理运用到二进制上,将负数转化为值来计算。:
+5的原码是:0000 0101,
+5的反码是:1111 1010,
+5的补码是:1111 1011, 所以我们的-5在二进制可以用1111 1011来表示。
因为byte只有八位,当它转化为int时变成32位,所以直接是补上24个零:
int 类型+5二进制表达式:0000 0000 0000 0000 0000 0000 0000 0101。
-5就要变成+5原码的补码:
反码:1111 1111 1111 1111 1111 1111 1111 1010
补码:1111 1111 1111 1111 1111 1111 1111 1011
0XFF在二进制中是这样的:0000 0000 0000 0000 0000 0000 1111 1111
&运算:0&1 = 0 ,0&0=0,1&1=1
当-5和0XFF进行&运算时得到的结果:0000 0000 0000 0000 0000 0000 1111 1011
会发现 int 和byte得到的负数结果是一样的,所以加上&0XFF本质上是为了保持二进制补码的一致性,当byte转化为int时,当其为负数时必然高出的24位会补1,而&0XFF将高出的24位重新变成0,保持了二进制的一致性。
各位如果觉得我分析有道理就给我点个赞吧,如果觉得有问题欢迎指出。