BigInteger クラス
このチュートリアルではBigIntegerクラスは、任意に大きな整数を扱うためのものである。BigIntegerオブジェクトは、大きなビットマスクが必要な暗号アプリケーションや、本当に大きな整数が必要な場所でよく使われる。
レベル初心者
プラットフォーム:Windows, macOS, Linux, iOS, Android
クラス: BigInteger,TextEditor,MemoryBlock
スタート
このチュートリアルのデモ・プロジェクトのダウンロードはこちらから:PIP|ZIP.プロジェクトを解凍し、最初のヘッダーファイルをProjucerで開く。
このステップでヘルプが必要な場合は、以下を参照してください。Tutorial: Projucer Part 1: Getting started with the Projucer.
デモ・プロジェクト
このデモ・プロジェクトでは、さまざまな計算結果を表示できるシンプルなテキスト・コンソールをセットアップしている。これによってBigIntegerクラスがあります。
デフォルトの設定では、デモ・プロジェクトは11から始まる100個の整数を表示する。それぞれの新しい値は、古い値に11を掛けたものである。

ご覧のようにBigIntegerクラスは確かに非常に大きな整数を表すことができる! 符号付き32ビット整数(たとえばint
ほとんどのコンパイラでは、この型は2,147,483,647までの数値を表すことができます。int64
JUCEのタイプ)は、最大9,223,372,036,854,775,807まで表現できる!
テストベッド・コード
このチュートリアルでは、デモ・プロジェクトの一部を変更し、以下の機能のさまざまなデモンストレーションを行います。BigIntegerクラスである。これから説明するコードはすべてMainComponent
クラスです。実際、すべての変更はrunExample()
関数である。
void runExample()
{
logMessage ("------------------------- START --------------------------");
int base = 10;
juce::BigInteger bigInt = 11;
for (auto iteration = 0; iteration < 100; ++iteration)
{
logMessage (bigInt.toString (base));
bigInt *= 11;
}
logMessage ("----------------------- FINISHED -------------------------");
}
ここではBigIntegerオブジェクトが11で初期化され、それを繰り返すたびに11が 掛けられる。for()
ループそのlogMessage()
関数に渡された文字列を、単にTextEditorオブジェクトがある。
テストベッドのコードを紹介したところで、次の操作を試してみましょう。BigIntegerオブジェクトがある。
異なる幾何学的シーケンスを生成するために、異なる開始値と乗数を試してみてください。
バイナリーパターン
についてBigIntegerクラスはバイナリ演算もサポートしている。実際BigIntegerクラスはしばしばビットマスクとして使われる(例えばAudioIODeviceクラス使用BigIntegerオブジェクトは、有効な入出力チャンネルを表します。Tutorial: The AudioDeviceManager class).以下はBigIntegerの値から始まる2進数(base-2を使用)の値 (11
を2進数で表し、各反復ごとに1つ左へビットシフトする:
void runExample()
{
logMessage ("------------------------- START --------------------------");
int base = 2;
juce::BigInteger bigInt = 3;
for (auto iteration = 0; iteration < 100; ++iteration)
{
logMessage (bigInt.toString (base));
bigInt = bigInt << 1;
}
logMessage ("----------------------- FINISHED -------------------------");
}
ここでは、2つの1と多くの末尾のゼロを含む2進値が得られることがわかる:
...
11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
----------------------- FINISHED -------------------------
開始ビットパターンを変えてみる。あるいは、非常に大きな 値から始めて、代わりに徐々に右にビットシフトしてください。
ビットを個別に設定し、テストすることもできる。例えば、これは最初の30個の偶数ビットを設定し、その結果を2進数、10進数、16進数、8進数で表示する:
void runExample()
{
logMessage ("------------------------- START --------------------------");
juce::BigInteger bigInt;
for (auto bit = 0; bit < 60; bit += 2)
bigInt.setBit (bit);
logMessage (juce::String ("binary: ") + bigInt.toString (2));
logMessage (juce::String ("decimal: ") + bigInt.toString (10));
logMessage (juce::String ("hex: ") + bigInt.toString (16));
logMessage (juce::String ("octal: ") + bigInt.toString (8));
logMessage ("----------------------- FINISHED -------------------------");
}
結果はこうなるはずだ:
------------------------- START --------------------------
binary: 10101010101010101010101010101010101010101010101010101010101
decimal: 384307168202282325
hex: 555555555555555
octal: 25252525252525252525
----------------------- FINISHED -------------------------
上記のコードを出発点として、さまざまなパターンのビットを設定してみてください。
のビットをテストできる。BigIntegerあたかもBigIntegerオブジェクトはbool
値をテストします。この例では、幾何学的シーケンスを生成するためにオリジナ ルのコードを使用し、生成された各値に対してビット3をテストする:
void runExample()
{
logMessage ("------------------------- START --------------------------");
int base = 10;
juce::BigInteger bigInt = 11;
for (auto iteration = 0; iteration < 100; ++iteration)
{
bool isBit3set = bigInt[3];
logMessage (bigInt.toString (base) + " : " + (isBit3set ? "Bit 3 is set" : "Bit 3 is NOT set"));
bigInt *= 11;
}
logMessage ("----------------------- FINISHED -------------------------");
}
これにより、C++の標準的なビット単位の演算子を使うよりも、コードがずっと読みやすくなる。ビットのセットとテストはBigIntegerクラスでは、整数が小さくても役に立つ!