按位与运算符的使用
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;
...
如果错误=-11,函数returns ERR_4。我知道 & 运算符是按位与运算符,但为什么有人要在这种情况下使用它?
它用于允许您在单个 int 中存储多个错误标志;它更像是一个 C 公理。
各个 ERR_XX
值表示为相应错误标志设置的位(例如,ERR_4 = 00000100
)。如果设置了多个位,则存在多个错误,例如 00001100
是 ERR_4 和 ERR_8。
要检查某个位是否已设置,它是 ANDed; 00001100
和 ERR_4 == 00000100
。 for循环通过每次循环乘以2来遍历可能的错误。
这样是不是更容易理解了?
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();
}
你的二进制错误(2补码)是:
1111111111111111111111111110101
因为左边的位是 1 你的整数是负数,第二 (2) 和第四 (8) 位设置为 0,这使你的 int 值 -(1+2+8) = - 11
AND (&) 也被用作掩码,在您的示例中它会像这样:
您的循环值为:
1,2,4,8,16
11111111111111111111111111110101 & 00000000000000000000000000000001 == 1
11111111111111111111111111110101 & 00000000000000000000000000000010 == 0
11111111111111111111111111110101 & 00000000000000000000000000000100 == 4
11111111111111111111111111110101 & 00000000000000000000000000001000 == 0
11111111111111111111111111110101 & 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
我正在尝试分析一些旧代码以了解在出现错误时它在做什么。这是函数:
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,函数returns ERR_4。我知道 & 运算符是按位与运算符,但为什么有人要在这种情况下使用它?
它用于允许您在单个 int 中存储多个错误标志;它更像是一个 C 公理。
各个 ERR_XX
值表示为相应错误标志设置的位(例如,ERR_4 = 00000100
)。如果设置了多个位,则存在多个错误,例如 00001100
是 ERR_4 和 ERR_8。
要检查某个位是否已设置,它是 ANDed; 00001100
和 ERR_4 == 00000100
。 for循环通过每次循环乘以2来遍历可能的错误。
这样是不是更容易理解了?
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();
}
你的二进制错误(2补码)是:
1111111111111111111111111110101
因为左边的位是 1 你的整数是负数,第二 (2) 和第四 (8) 位设置为 0,这使你的 int 值 -(1+2+8) = - 11
AND (&) 也被用作掩码,在您的示例中它会像这样:
您的循环值为:
1,2,4,8,16
11111111111111111111111111110101 & 00000000000000000000000000000001 == 1
11111111111111111111111111110101 & 00000000000000000000000000000010 == 0
11111111111111111111111111110101 & 00000000000000000000000000000100 == 4
11111111111111111111111111110101 & 00000000000000000000000000001000 == 0
11111111111111111111111111110101 & 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