按位与运算符的使用

Bitwise AND operator use

我正在尝试分析一些旧代码以了解在出现错误时它在做什么。这是函数:

error = -11; 
protected String decodeError(int error){   
  StringBuffer msg = new StringBuffer();   
  for(int j=1; j<ERR_16+1; j=j*2 ){
    if( (error&j)==j ){
      switch(j){
        case ERR_1:
          msg.append("error1");
          break;
        case ERR_4:
          msg.append("error4");
          break;
        case ERR_8:
          msg.append("error8");
          break;
        case ERR_16:
          msg.append("error16");
          break;
      }
    }   
  }   
  return msg.toString(); 
}
ERR_16 = 16; 
ERR_2 = 2; 
ERR_4 = 4; 
...

如果错误=-11,函数returns ERR_4。我知道 & 运算符是按位与运算符,但为什么有人要在这种情况下使用它?

它用于允许您在单个 int 中存储多个错误标志;它更像是一个 C 公理。

各个 ERR_XX 值表示为相应错误标志设置的位(例如,ERR_4 = 00000100)。如果设置了多个位,则存在多个错误,例如 00001100 是 ERR_4 和 ERR_8。 要检查某个位是否已设置,它是 ANDed; 00001100 和 ERR_4 == 00000100。 for循环通过每次循环乘以2来遍历可能的错误。

这样是不是更容易理解了?

protected String decodeError(int error){   
  StringBuffer msg = new StringBuffer();
  if ((error & ERR_1) != 0)
    msg.append("error1");
  if ((error & ERR_4) != 0)
    msg.append("error4");
  if ((error & ERR_8) != 0)
    msg.append("error8");
  if ((error & ERR_16) != 0)
    msg.append("error16");
  return msg.toString();
}

你的二进制错误(2补码)是:

1111111111111111111111111110101

因为左边的位是 1 你的整数是负数,第二 (2) 和第四 (8) 位设置为 0,这使你的 int 值 -(1+2+8) = - 11

AND (&) 也被用作掩码,在您的示例中它会像这样:

您的循环值为:

1,2,4,8,16

11111111111111111111111111110101 & 00000000000000000000000000000001 == 1

11111111111111111111111111110101 & 00000000000000000000000000000010 == 0

11111111111111111111111111110101 & 00000000000000000000000000000100 == 4

11111111111111111111111111110101 & 00000000000000000000000000001000 == 0

11111111111111111111111111110101 & 00000000000000000000000000010000 == 16

意思是你会得到输出

错误 1、错误 4 和错误 16

这意味着您从一个整数中提取了多个错误

every Bit stands for another error and with the masking (AND) you check which ones are stored in your integer