ここにいくつかのサンプルコードがあります
int test = 1234;
int modValue, andValue;
modValue = test % -8;
andValue = test & 7;
printf("Mod Value = %d And Value = %d\n", modValue, andValue);
int counter = 0;
for(counter = 0; counter < 10000; counter++) {
modValue = counter % -8;
andValue = counter & 7;
if(modValue != andValue) {
printf("diff found at %d\n", counter);
}
}
Ideone リンク: http://ideone.com/g79yQm
負の数は異なる結果をもたらします。それはそれについてですが、それ以外は、すべての正の値に対して常にまったく同じように機能しますか?
負の数の場合でも、それらは常に 1 循環ラウンドだけオフセットされるように見えます。
この質問に似ていると思っている人なぜモジュロ演算子が必要なのですか? 質問ですが、1を引きません。
これはモジュラス値よりも高い負の値を使用し、正の値に対してのみ機能します。
これは、IDA-PRO Hex-Ray のデコンパイラーが、異なる関数で同じソース コードの両方に対してモジュラスを生成する場合と演算子%
を生成する場合があるように見えることからわかりました。AND
&
オプティマイザーによるものだと思います。
私が逆コンパイルしたこのプロジェクトは負の値を使用するべきではないので、元のソース コードは何だったのだろうかと思います。
またAnd
、モジュラスコマンドとして使用すると、循環操作では常にモジュラスが使用されることがわかっていますが、この場合、結果がまったく異なるためVal And 7
、使用する必要があります。Val % 7
abs(Val) and 7
正の値の係数を持つものはすべて間違っているように見えるため、元のコードが最も使用される可能性が高いと言うのを忘れていました。だから、それが最善だと思います。