web-dev-qa-db-ja.com

プログラミングにおけるモジュラス(%)の実際の使用法は何ですか?

重複の可能性:
mod演算子をいつ使用するかを認識する

モジュラスの実際の使用法は何ですか?モジュロ除算とは何か知っています。私の頭に浮かぶ最初のシナリオは、それを使用して奇数と偶数を見つけ、クロック演算を行うことです。しかし、他にどこでそれを使うことができますか?

11
kofucii

私が見つけた最も一般的な使用法は、配列インデックスを「ラップラウンド」することです。

たとえば、配列を繰り返し循環させたい場合は、次を使用できます。

int a[10];
for (int i = 0; true; i = (i + 1) % 10)
{
  // ... use a[i] ...
}

モジュロは、iが[0、10)の範囲内にとどまるようにします。

23
Peter Alexander

私は通常、すべての反復ではなく、すべてのXループで何かを実行する必要がある場合に、タイトなループでそれらを使用します。

例:

int i;
for (i = 1; i <= 1000000; i++)
{
   do_something(i);
   if (i % 1000 == 0)
       printf("%d processed\n", i);
}
6
Generic Person

数値を文字列として出力するには、桁の値を見つけるためのモジュラスが必要です。

string number_to_string(uint number) {
  string result = "";
  while (number != 0) {
    result = cast(char)((number % 10) + '0') ~ result;
    //                   ^^^^^^^^^^^
    number /= 10;
  }
  return result;
}
6
kennytm

モジュラス演算の用途の1つは、 ハッシュテーブル を作成する場合です。これは、ハッシュ関数の値を配列のインデックスに変換するために使用されます。 (ハッシュテーブルのサイズが2の累乗である場合、モジュラスはビットマスクを使用して実行できますが、それはそれでもモジュラス演算です。)

5
Donal Fellows

国際銀行口座番号の管理番号については、 mod97テクニック

また、nの反復後に何かを行うための大規模なバッチ。 NHibernate の例を次に示します。

ISession session = sessionFactory.openSession();
ITransaction tx = session.BeginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.Save(customer);
    if ( i % 20 == 0 ) { //20, same as the ADO batch size
        //Flush a batch of inserts and release memory:
        session.Flush();
        session.Clear();
    }
}

tx.Commit();
session.Close();
4
user333306
  • 暗号化。それだけでモジュラスのわいせつなパーセンテージを説明します(私は誇張していますが、あなたはポイントを取得します)。

ウィキペディアのページ も試してみてください:

モジュラー算術は、数論、群論、環論、結び目理論、抽象代数、暗号化、コンピューターサイエンス、化学、視覚芸術および音楽芸術で参照されます。

私の経験では、十分に高度なアルゴリズムは、おそらく上記のトピックのもう1つに触れるでしょう。

3
dirkgently

さて、あなたがそれを見ることができる多くの視点があります。あなたがそれを数学演算として見ているなら、それは単なるモジュロ除算です。 %のようにこれを必要としない場合でも、減算を使用して実現できますが、すべてのプログラミング言語は非常に最適化された方法で実装します。

また、モジュラス除算は、奇数と偶数の検索やクロック演算に限定されません。このモジュール演算を必要とするアルゴリズムは数百あります。たとえば、暗号化アルゴリズムなどです。したがって、他の+、-、*、/などのような一般的な数学演算です。

数学的な観点を除いて、Perlのように、さまざまな言語が組み込みデータ構造を定義するためにこの記号を使用します。%hashは、プログラマーがハッシュを宣言したことを示すために使用されます。したがって、すべてはプログラミング言語の設計によって異なります。

したがって、%の使用リストに追加できる他の多くの視点がまだあります。

3
Anil Vishnoi

バッファリングされた通信の通常の実装では循環バッファを使用し、モジュラス演算でそれらを管理します。

ビット演算子を持たない言語の場合、モジュラスを使用して数値の最下位nビットを取得できます。たとえば、xの下位8ビットを取得するには:

x % 256

これは次と同等です:

x & 255
2
imgx64