ビット単位&オペレータは、このように、あなたが使うべきものです。 の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
これはここでは動作しません。あなたの推測されたマスクは、あまりにも複雑なので間違っているかもしれないようです。一緒にあなたの構文コードとロジックのコードを見てみると:左から13番目のビットが論理エラーや構文エラーの主な違いがあるよう
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
に見えます。だからこのような何かをすることができます:
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部分は特定の種類のエラーを意味し、最後の部分はエラーに関する情報を提供します。あなたは自分でいくつかの実験をしなければなりませんが、うまくいけば、これはビットマスクを行うための正しい道にあなたを導きます。
ここでは、COMエラーコードの構成方法について説明します。http://msdn.microsoft.com/en-us/library/bb401631.aspx –
Ahh、Alexeiに感謝します。それはおそらく最も知っている有用なものです。 –