6


0

数学オペランド(modなど)のみを使用して、この非常に単純なブールロジックを実装する方法はありますか?

値を1減らし、ゼロに達したら、最大値に設定します。 `if(n-1 == 0){n = max;に頼らずに数学でこれを行う方法はありますか} `

値を1ずつ増やし、最大値よりも大きいときにゼロに設定するという反対のシナリオは、 `n =(n + 1)%(max + 1);`を使用して簡単に実現できます。 さらに、(1つだけではなく)どんな量でも増やすことができ、それでも正しく「ラップ」されるため、これはさらに優れています。

これまでの回答をありがとう。 明確にするために、ブール論理(if / else)またはブール演算子(!、&&など)をまったく使用しないことを意味しました。 私はこれをどうやってやるのか興味がありました。 コメントが提供されている限り、以下の正解は本当に読みにくくなりますか? 任意の数を減算し、正しいラップアラウンドを期待するためのより一般的なケースでは、それを使用する必要があります。

11 Answer


6


n = max - ((max - n +1)%max)


5


単にパフォーマンス上の理由でこれを行っている場合は、それに対してアドバイスします。 通常、ほとんどのアーキテクチャでは「%」は非常に高価な操作です。通常、単純な比較、分岐、追加の方が効率的です。 もちろん、投機的/時期尚早な最適化に関する通常の警告が適用されます。


1


問題は、Cの `%`演算子が負の配当に直面したときに負の結果を返すことです。 多くの場合、これは必要なものではありません。

-1 mod n == n-1`を満たす mod`関数が必要な場合は、Cで次のことを行う必要があります。

int mod(int a, int b)
{
    return (a%b + b) % b;
}

その後できます

n=mod(n-1, max+1);

「n」をデクリメントし、「n == 0」のときに「max」に折り返すようにします。 インクリメントの場合と同様に、これは任意のステップサイズで機能することに注意してください。


1


言語間の数学には十分なバリエーションがあるため、これを行うには言語に依存しない方法があるとは思わない。 基本的な単一のテクニックがすべての可能な言語で機能するように、言語がどのように式を記述するかにはあまりにも多くのバリエーションがあります。

特定の言語を選択すると、それが可能になる可能性がかなり高くなります。 たとえば、CまたはC +では、次のようなことができます: `n =(n-1)((n-1)== 0)* max;`

Cの場合、比較(この場合は ==)は、偽の場合は0、真の場合は1の結果を生成します。 したがって、私たちがしているのは、「n-1!= 0」のとき/ if「max * 0」、および「n-1 == 0」のとき/ if「max * 1」を追加することです。


0


もっと良い方法があるかもしれませんが、 `n = max-(max-n + 1)%(max + 1)`は機能すると思います。 増分式には0を含めるため、両端に0を含めると仮定しています。


0


実際にあなたもできる

n = (n - 1) + ((!(n - 1)) * max);


0


これについては:+ n =!n * max +(!! n)* n;


0


Re:ブール値なし/ max)* n;


0


ただ聞いてください:なぜブール演算を避けたいのですか?

アプリケーションで条件付きコードを回避する場合は、ブール値に格納されているブール式を使用できます。 これらはi386のSETcc命令にマッピングされ、他のISAにアナログインストルメントが存在すると仮定します。

その場合、ブール式を使用しても、非条件コードを使用でき、次を使用できます。

真のブール結果が序数1(Delphiコードの場合)に等しく、偽のブール値が0に等しいという仮定の下で、次のように記述できます。

next := current - 1 + ( ( 1 + max ) and -Ord( current = 0 ) );

ブール演算で答えを出したので、これに投票しないでください。 これが根本的な問題の異なる解決策であるかどうかを確認したいだけです。

それでも:条件付きコードははるかに読みやすいと思います。


-1


1と比較してみませんか?

`if(n == 1){n = max; } `