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