我正在尝试分析一些旧代码以了解在出现错误时它正在做什么。这是功能:
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;运算符是按位运算符,但为什么有人应该在这种情况下使用它?
答案 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();
}