C++ でモジュロ演算子を使用する

胡金庫 2023年10月12日
  1. 演算子 % を使って除算で残量を計算する
  2. C++ で与えられた最大数以下の乱数を生成するために % 演算子を使用する
  3. ライブラリ定義関数オブジェクトを使用して C++ の % 演算子を置き換える
C++ でモジュロ演算子を使用する

この記事では、C++ でのモジュロ演算子の使い方を紹介します。

演算子 % を使って除算で残量を計算する

モジュロ (%)演算子の標準的な機能は、除算の残りを計算することです。文の戻り値 - x % yxy で割った後に残った残りを表します。モデューロ演算子は、両方のオペランドが整数でなければならず、除数は 0 以外の値でなければならないように定義されています。次の例は、異なる符号付き整数のペアでモジュロ演算子を示しています。なお、printf 関数を使って % という文字をコンソールに表示するには、%% を使用する必要があります。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};

  for (size_t i = 0; i < ivec1.size(); ++i) {
    printf("% -d %% % -d = % -d\n", ivec1[i], ivec2[i], ivec1[i] % ivec2[i]);
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

 24 %  7 =  3
 24 %  8 =  0
-24 % -8 =  0
-24 % -7 = -3
 24 % -6 =  0

C++ で与えられた最大数以下の乱数を生成するために % 演算子を使用する

モジュロ演算子の代替的な使用法は、特定の整数以下の数値のみを提供するように乱数生成器を制御することです。プログラマはランダム性の質の必要性に応じて乱数生成ツールキットを選択する責任があるが、どちらの方法も生成される数値の上限を指定するために % と組み合わせることができます。この場合、rand 関数を用います。この戻り値は、モジュロ演算子を用いて希望する最大値と対になります。

#include <ctime>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

constexpr int MAX = 1000;
constexpr int NUMS_TO_GENERATE = 10;

int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};

  std::srand(std::time(nullptr));
  for (int i = 0; i < NUMS_TO_GENERATE; i++) {
    cout << rand() % MAX << "; ";
  }
  cout << endl;
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

98; 194; 398; 190; 782; 550; 404; 557; 509; 945;

ライブラリ定義関数オブジェクトを使用して C++ の % 演算子を置き換える

C++ 標準ライブラリでは、伝統的な算術演算子、関係演算子、論理演算子を表す複数のクラスが定義されています。これらは関数オブジェクトと呼ばれ、std::plus<Type>std::modulus<Type> などの名前が付けられています。Type は呼び出し演算子のパラメータの型を指定します。以下のコードサンプルは、std::modulus 関数オブジェクトを整数のベクトルに利用したものです。

#include <ctime>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};

  std::modulus<> intMod;
  int mod_of_nums = intMod(ivec1[1], ivec2[1]);
  printf("%d %% %d = %d\n", ivec1[1], ivec2[1], mod_of_nums);

  return EXIT_SUCCESS;
}

出力:

24 % 8 = 0
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Modulo