アセンブリ言語プログラミングをいじっていますが、論理演算子 AND を使用して数値が 4 の倍数であるかどうかをどのように判断できるか知りたいです。
「div」または「剰余」命令を使用してそれを行う方法は知っていますが、数値/単語のビット操作でこれを実行しようとしています。
誰かが私を正しい方向に向けることができますか? 私は MIP を使用していますが、言語にとらわれない回答で問題ありません。
アセンブリ言語プログラミングをいじっていますが、論理演算子 AND を使用して数値が 4 の倍数であるかどうかをどのように判断できるか知りたいです。
「div」または「剰余」命令を使用してそれを行う方法は知っていますが、数値/単語のビット操作でこれを実行しようとしています。
誰かが私を正しい方向に向けることができますか? 私は MIP を使用していますが、言語にとらわれない回答で問題ありません。
数値が別の数値の倍数であるかどうかを検出するには、単にx MOD y
. 結果が の場合0
、偶数の倍数です。
y
また、 のべき乗である2
すべての(x MOD y)
が と等しいことも真実です(x AND (y - 1))
。
したがって:
IF (x AND 3) == 0 THEN
/* multiple of 4 */
編集:
わかりました、いつが 2 の累乗であるか を知りたいと思います。説明できるように最善を尽くします。(x MOD y) == (x AND (y - 1))
y
基本的に、数値が 2 の累乗である場合、その数値には 1 つのビットが設定されます (2 進法は基数 2 であるため)。これは、すべての下位ビットが設定されていないことを意味します。たとえば16 == 10000b, 8 == 1000b
、 などです。
これらの値のいずれかから 1 を引いた場合。設定されていたビットが設定解除され、それより下のすべてのビットが設定されることになります。
15 = 01111b, 7 = 0111b
など。したがって、基本的には、下位ビットのいずれかが設定されているかどうかをテストするために使用できるマスクを作成します。それが明確だったことを願っています。
EDIT: Bastien Léonardのコメントもそれをよくカバーしています:
(符号なし) を 4 で割ると、2 ビット右にシフトします。したがって、残りは、割ると失われる 2 つのビットです。4 - 1 = 11b、つまり、値と AND を取ったときに右端の 2 ビットを生成するマスクです。
編集:おそらくより明確な説明については、このページを参照してください: http://en.wikipedia.org/wiki/Power_of_two#Fast_algorithm_to_check_if_a_positive_number_is_a_power_of_two .
2 の累乗を検出し、AND を 2 の累乗の場合に高速モジュロ演算として使用する方法について説明します。
(x & 3) == 0
Wrt アセンブリ言語。利用可能な場合は TST を使用し、そうでない場合は AND を使用し、ゼロ フラグをチェックします。
x86 アセンブリの場合:
test eax, 3
jnz not_multiple_of_4
; action to be taken if EAX is a multiple of 4
not_multiple_of_4:
; ...
下位 2 ビットが 0 の場合、数値は 4 の倍数であるため、単純に数値を右に 2 回シフトし、シフトされたビットの 0 を確認できます。