繁体   English   中英

按位AND运算符使用

[英]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; 
...

如果error = -11,函数将返回ERR_4。 我知道&运算符是按位AND运算符,但是为什么在这种情况下应该使用它呢?

您的二进制(2补码)错误为:

11111111111111111111111111110101

因为左位是1,您的整数是负数,并且第二(2)和fourth(8)位设置为0,所以这会使您的int变为-(1 + 2 + 8)= -11

AND(&)也被称为Mask,在您的示例中,它将像这样:

您的循环值是:

1,2,4,8,16

11111111111111111111111111111110101&00000000000000000000000000000001 == 1

11111111111111111111111111111110101&00000000000000000000000000000010 == 0

11111111111111111111111111111110101&00000000000000000000000000000100 == 4

11111111111111111111111111111110101&00000000000000000000000000001000 == 0

11111111111111111111111111111110101&00000000000000000000000000010000 == 16

意思是你会得到输出

错误1,错误4和错误16

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

每个位代表另一个错误,并使用掩码(AND)来检查哪些错误存储在整数中

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

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

这更容易理解吗?

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM