按位AND运算符使用

时间:2017-10-05 07:45:56

标签: java bitwise-operators

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

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,该函数返回ERR_4。我知道&amp;运算符是按位运算符,但为什么有人应该在这种情况下使用它?

3 个答案:

答案 0 :(得分:5)

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

11111111111111111111111111110101

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

AND(&amp;)也被称为Mask,在你的例子中它会像这样:

您的循环值为:

1,2,4,8,16

11111111111111111111111111110101&amp; 00000000000000000000000000000001 == 1

11111111111111111111111111110101&amp; 00000000000000000000000000000010 == 0

11111111111111111111111111110101&amp; 00000000000000000000000000000100 == 4

11111111111111111111111111110101&amp; 00000000000000000000000000001000 == 0

11111111111111111111111111110101&amp; 00000000000000000000000000010000 == 16

意味着你会得到输出

error1,error4和error16

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

  

每个Bit代表另一个错误,并且使用屏蔽(AND)检查哪些存储在整数中

答案 1 :(得分:0)

它曾经允许你在一个int中存储几个错误标志;它更像是一个C公理。

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

答案 2 :(得分:0)

这更容易理解吗?

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