& 0xff 的作用
&表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化**
作用1、取得低八位:
例如:0x1234 表示为二进制 0001 0010 0011 0100
遵照**&运算规则:1 & 1 = 1;1 & 0 =0;**
且 oxff 与 0x123 进行 & 操作时 oxff 会按高位补0的规则补充到16位:
0xff : 0000 0000 1111 1111
0x1234 & 0xff = 0011 0100;
可以取得低八位。
同理,也可以取高八位
0x1234 >>> 8 & 0xff = 0001 0010
作用2、保证补码的一致性:
- 计算机是用补码来存储数字的;
- 正数的补码等于原码;
- 负数的补码等于反码+1;
- 一个数的补码的补码等于原码。
-127原码1111 1111,反码1000 0000,补码1000 0001。计算机存储的是1000 0001,用十六进制表示为0x81。
将它转换为int时:
使用补符号位扩展,结果为: 1111 1111 1111 1111 1111 1111 1000 0001
用十六进制表示为0xFFFFFF81。为了计算十进制值,计算它的补码,结果为: 1000 0000 0000 0000 0000 0000 0111 1111
将这个二进制数转成十进制的结果是-127
当使用补零扩展时:
结果为: 0000 0000 0000 0000 0000 0000 1000 0001
用十六进制表示为0x81。为了计算十进制值,计算它的补码,结果为: 0000 0000 0000 0000 0000 0000 1000 0001
将这个二进制数转成十进制的结果是129
故:
(1)使用补零扩展能够保证二进制存储的一致性,但不能保证十进制值不变。
(2)使用补符号位扩展能够保证十进制值不变,但不能保证二进制存储的一致性。
但是当我们做 byte->int的时候,真的都是关注它十进制真值一致吗。显然不是。
例如:当拿到一个文件的 byte[] 数组时,我们关注的很显然是它存储的二进制存储的补码。所以这时我们再将其进行转换时就要保证它补码的一致性了。 而 & 0xff 就是标准的补0拓展。
所以 &0xff 也是为了保证补码的一致性