php有没有tohexstring,完美起航-Integer.toHexString(b[n]&0XFF)为什么要添加&0XFF

Integer.toHexString()这个方法是将byte字节转换为String,下图的b[n]&0XFF必须转化成一个int类型的

dc063e45c4bf9700731c4c6b63b06cf8.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值