Bootstrap

Integer.toHexString(b[n] & 0XFF)为什么要添加&0XFF

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,保持了二进制的一致性。

各位如果觉得我分析有道理就给我点个赞吧,如果觉得有问题欢迎指出。

;