2009-04-14 9 views
8

私はアセンブリ言語のプログラミングに戸惑うことがあります。論理演算子を使用して数値が4の倍数であるかどうかをどうやって知ることができるのでしょうか?論理演算子ANDだけを使用して数値が4の倍数であるかどうかを確認する方法はありますか?

私は「DIV」または「余り」の手順を使用してそれを行う方法を知っているが、私は数/ワードのビット操作でこれをやろうとしています。

誰でも正しい方向に向けることができますか?私はMIPを使用していますが、言語にとらわれない答えはうまくいきます。まあ

答えて

22

、番号が別の倍数であるかどうかを検出するために、あなたは単にx MOD yを行う必要があります。結果が0の場合、それは偶数倍です。

2の累乗であるyごとに、(x MOD y)(x AND (y - 1))に相当します。したがって

IF (x AND 3) == 0 THEN 
    /* multiple of 4 */ 

EDIT:

OK、あなたはyは、私が説明するために、全力を尽くします2のべき乗であるときなぜ(x MOD y) == (x AND (y - 1))を知りたいです。

数が2のべき乗である場合(バイナリベース2であるため)基本的に、それは、単一のビットが設定されています。これは、下位ビットのすべてが設定されていないことを意味します。だから、例えば:16 == 10000b, 8 == 1000bなど

あなたは、これらの値のいずれかから1を減算した場合。あなたは設定されていないビットがセットされ、その下のすべてのビットがセットされます。

15 = 01111b, 7 = 0111bなどです。したがって、基本的に、下位ビットのいずれかが設定されているかどうかをテストするために使用できるマスクが作成されます。私はそれがはっきりしたことを望む。

EDIT:バスティアンレオナールのコメントがあまりにもそれをカバー:

あなたは(符号なし)は4で割るならば、あなたは右に2ビットをシフト 。したがって、 の剰余は2ビットで、除算すると が失われます。 4 - 1 = 11b、 つまり、 の右端のビットと、 の値をANDすると、マスクが生成されます。

EDIT:可能性がより明確に説明するために、このページを参照してください:http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two

それは2

+0

ええと、彼の答えは、ビット操作を使用し、全体の答えを見て... – user83255

+0

@ilproxyil私はコメントしているので、彼の答えは編集されています。 – Mithrax

+0

さて、私はあなたがなぜy -1で、MOD yと同じ値を得ることができるのか説明していました。 –

4

(X & 3)== 0

W.r.t.の電力である場合は、2のべき乗を検出し、使用し、高速モジュロ演算としてカバー可能であればTSTを使用し、そうでない場合はANDを使用し、ゼロフラグを確認します。

+0

なぜ3ですか? – Mithrax

+0

@ジョンミリキンそれは間違っています、0は任意の数の倍数です。 – starblue

+0

@ジョン - はい0は0 x 4の積です。http://en.wikipedia.org/wiki/Multiple_(mathematics) – tvanfosson

1

数値は下位2ビットが0の場合は4の倍数なので、右に2回シフトするだけで0にシフトしたビットをチェックします。x86のアセンブリで

1

test eax, 3 
    jnz not_multiple_of_4 

    ; action to be taken if EAX is a multiple of 4 

not_multiple_of_4: 
    ; ...