我怎样才能更有效地进行模式检查?

时间:2012-01-27 01:24:39

标签: c# math .net-3.5 error-handling binary

这是一些采用int错误代码(scode)并尝试查看它是否适合某种模式的代码。我应该使用模除法运算符吗?

const int MASK_SYNTAX_ERR = -2146827000;
if ((MASK_SYNTAX_ERR % scode) == MASK_SYNTAX_ERR)
    scriptError.GetSourceLineText(out sourceLine);

背景:我不得不通过观察推断出MASK_SYNTAX_ERR的值。以下是我观察到的各种语法错误代码:

// -Int Value (Formatted Value "0x{0:X8}")
-2146827281 (0x800A03EF)
-2146827279 (0x800A03F1)
-2146827280 (0x800A03F0)
-2146827283 (0x800A03ED)
-2146827284 (0x800A03EC)

以下是一些用于比较的逻辑错误代码:

-2146823281 (0x800A138F)
-2146823279 (0x800A1391)

(Trivia:代码本身调用IActiveScriptError.GetSourceLineText,这是来自IActiveScriptSite.OnScriptError实现。)

2 个答案:

答案 0 :(得分:3)

对于屏蔽操作,通常使用二进制和运算符(&)。我还建议使用十六进制表示法来使掩码更清晰。

if (data & MASK == MASK)
{
    DoStuff();
}

答案 1 :(得分:1)

按位&运算符是你应该使用的,如下所示:     const int MASK_SYNTAX_ERR = -2146827000;     if(MASK_SYNTAX_ERR& scode!= 0)         scriptError.GetSourceLineText(out sourceLine);

更多关于发生了什么。

MASK_SYNTAX_ERR的二进制表示是

1000 0000 0000 1010 0000 0101 0000 1000

对于在相同位置具有1的任何数字,此比较将返回true。拿你的第一个语法错误代码,例如:

MASK 1000 0000 0000 1010 0000 0101 0000 1000
CODE 1000 0000 0000 1010 0000 0011 1110 1111
   & 1000 0000 0000 1010 0000 0001 0000 1000 != 0

所以面具在这里工作。现在,比较逻辑错误代码:

MASK 1000 0000 0000 1010 0000 0101 0000 1000
CODE 1000 0000 0000 1010 0001 0011 1000 1111
   & 1000 0000 0000 1010 0000 0001 0000 1000 != 0

它也适用于此,它不应该。似乎你推导出的面具可能是错误的,因为它太复杂了。一起查看语法代码和逻辑代码:

SYNTAX 1000 0000 0000 1010 0000 0011 1110 1111
       1000 0000 0000 1010 0000 0011 1111 0001
       1000 0000 0000 1010 0000 0011 1111 0000
       1000 0000 0000 1010 0000 0011 1110 1101
       1000 0000 0000 1010 0000 0011 1110 1100
LOGIC  1000 0000 0000 1010 0001 0011 1000 1111
       1000 0000 0000 1010 0001 0011 1001 0001

看起来左边的第13位是逻辑错误和语法错误之间的关键区别。所以你可以这样做:

const int SYNTAX_MASK = 1 << 12;
if (scode & SYNTAX_MASK != 0)
{
    //It's a syntax error
    scriptError.GetSourceLine(out sourceLine);
}
else
{
    //It's a logic error
}

您可以使用类似的分析来计算出用于其他目的的蒙版。很多时候,掩码用于从int中获取一个位,而不是像你一样复杂的东西。可能是代码的0x800A部分意味着某种错误,最后一部分提供有关错误的信息。你自己必须做一些实验,但希望这能让你在正确的位置上做位掩码。