2012-01-27 11 views
0

ここでは、intエラーコード(scode)を受け取り、特定のパターンに適合するかどうかを調べるコードを示します。これを行うにはモジュロ除算演算子を使用する必要がありますか?このintパターンチェックをより効率的に行うにはどうすればよいですか?

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) 

(トリビア:コード自体がIActiveScriptError.GetSourceLineTextを呼び出している、これはあります

+1

ここでは、COMエラーコードの構成方法について説明します。http://msdn.microsoft.com/en-us/library/bb401631.aspx –

+0

Ahh、Alexeiに感謝します。それはおそらく最も知っている有用なものです。 –

答えて

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 

これはここでは動作しません。あなたの推測されたマスクは、あまりにも複雑なので間違っているかもしれないようです。一緒にあなたの構文コードとロジックのコードを見てみると:左から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部分は特定の種類のエラーを意味し、最後の部分はエラーに関する情報を提供します。あなたは自分でいくつかの実験をしなければなりませんが、うまくいけば、これはビットマスクを行うための正しい道にあなたを導きます。

+0

ありがとう。 –

+1

私は「if(scode&SYNTAX_MASK == 0)//文法エラーです。 –

+0

ええと、私はそれをすべて収集して、次回のように頭の中でそれをやろうとするのではなく、それはそうです。 –

3

マスキング操作では、通常、バイナリと演算子(&)を使用します。マスクがどのように機能するかを明確にするために、16進表記を推奨します。

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

これは、ブールAND演算子 '&&'とは異なり、ビット単位のAND演算子 '&'です。 – MRAB

+0

また、これは、エラーコードに一連のビットフラグが含まれており、個々に読み取られることを前提としています。あなたは、ビット単位でビットシフトしなければならないでしょうし、エラーコードから小さな4ビットエラー番号などの複数のビット情報を抽出する必要があります(28ビットの残りの部分にエラー番号固有の情報が含まれている可能性があります)。 – GGulati

+0

ありがとうございます。あなたはすぐにすべてのアップアップを手に入れたので、そしてredneckjediの拡張された説明のために、私は彼の答えを受け入れました。ここでの回答やコメントはすべて素晴らしいです。ありがとうございます。 –

関連する問題