java - 按位与运算符的使用

标签 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。我知道 & 运算符是按位 AND 运算符,但为什么有人应该在这种情况下使用它?

最佳答案

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

11111111111111111111111111110101

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

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

您的循环值为:

1,2,4,8,16

111111111111111111111111111110101 & 00000000000000000000000000000001 == 1

111111111111111111111111111110101 & 00000000000000000000000000000010 == 0

111111111111111111111111111110101 & 00000000000000000000000000000100 == 4

111111111111111111111111111110101 & 00000000000000000000000000001000 == 0

111111111111111111111111111110101 & 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

关于java - 按位与运算符的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580449/

相关文章:

java - 重复验证错误

java - 检测 Java 反射

java - 在 Windows 8 中为 Java 应用程序提供 Metro 外观

c - 如何用整数中的另一组半字节替换给定的半字节

java - Lunar Lander 中的 Android 垃圾收集

java - 方法引用 - 无效的方法引用 - 不能从静态上下文中引用

c# - 为什么在 C# 中进行按位运算时必须强制转换为 0(零)?

c - 如果 -8 & 7 不为 0,为什么输出为 False?

c++ - "x += x & (-x)"是什么意思?

c# - 如何重置ulong中的单个位?