使用0xff进行安慰,需要澄清

Jam*_*sev 8 java bit-manipulation

在以下代码段中,考虑使用注释等效替换第8行

1. private static String ipToText(byte[] ip) {
2.  StringBuffer result = new StringBuffer();
3.
4.  for (int i = 0; i < ip.length; i++) {
5.      if (i > 0)
6.          result.append(".");
7.
8.      result.append(ip[i]); // compare with result.append(0xff & ip[i]);
9.  }
10.
11.     return result.toString();
12. }
Run Code Online (Sandbox Code Playgroud)

.equals()测试确认添加0xff不会改变任何东西.是否有理由应用此蒙版?

Joe*_*oey 17

byte在Java中是一个介于-128和127之间的数字(有符号,就像Java中的每个整数一样(除非char您想要计算它)).通过和0xff你一起迫使它int在0到255之间变为正数.

它的工作原理是因为Java将int使用符号扩展执行扩展转换,因此不会使用负数而是byte负数int.屏蔽0xff将仅留下低8位,从而使数字再次为正(以及您最初的意图).

您可能没有注意到差异,因为您使用的byte[]值仅使用小于128的值进行测试.

小例子:

public class A {
    public static void main(String[] args) {
        int[] ip = new int[] {192, 168, 101, 23};
        byte[] ipb = new byte[4];
        for (int i =0; i < 4; i++) {
            ipb[i] = (byte)ip[i];
        }

        for (int i =0; i < 4; i++) {
            System.out.println("Byte: " + ipb[i] + ", And: " + (0xff & ipb[i]));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印

Byte: -64, And: 192
Byte: -88, And: 168
Byte: 101, And: 101
Byte: 23, And: 23
Run Code Online (Sandbox Code Playgroud)

显示了什么是什么byte,什么进入字节时它仍然是一个int&操作的结果之间的差异.