0x,左移,右移

0x代表的是十六进制,表示的是补码,默认为int类型,即32位,不足高位补0。
如:0xff=0x000000ff,每一位代表一个十六进制,
-2表示的补码为1111 1111 1111 1111 1111 1111 1111 1110。十六进制为 0xfffffffe

java 的>>为有符号又移,有符号右移就是右移之后,左边的补上符号位,正数补0,负数补1

>>>为无符号又移,无符号右移就是所有位数右移之后,无论该数为正还是为负,右移之后左边都是补上0

<<为左移,不区分有符号和无符号,都是左移之后右边补上0,最左边的符号位也直接移走。

当byte转int时候需要先和0xff进行&操作,这是因为,一个int是4个byte,4个byte分别组成int的4位,这就需要4个byte进行 | 操作,转int时除了自己的位置外别的位置应该为0,才能不影响其他位,如byte是-1,是因为从int里面摘出的8个字节是11111111(补码),这个只代表这一位的数值,除了最高位其他的都应该是正数,所以自动补的位都应该是0,只有最高位代表了符号。如果直接强转int的话会在高24位补1,但是我们在组装到int的时候是不需要他的其他位的,组装的时候可以用或也可以用加,因为有1的地方别的地方肯定是0所以0+1和0|1是一样的。

如:byte b[]={1,1,-1,1}。这个byte数组在组成int时会进行以下操作

0000 0001 0000 0000 0000 0000 0000 0000

|

0000 0000 0000 0001 0000 0000 0000 0000

|

1111 1111 1111 1111 1111 1111 0000 0000

|

0000 0000 0000 0000 0000 0000 0000 0001

这样就会变成

1111 1111 1111 1111 1111 1111 0000 0001  即-255而实际的补码应该是 0000 0001 0000 0001 1111 1111 0000 0001.即16842497

所以应该清除自己位置外所有的1,也就是和0xff相&后剔除高位,在进行移位操作。

注:当系统检测到负数byte可能会转化成int或者说byte与int类型进行运算的时候,就会将byte的内存空间高位补1(也就是按符号位补位)扩充到32位,再参与运算。

猜你喜欢

转载自blog.csdn.net/cjc000/article/details/89947117