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までの数値を表すことができます。int64JUCEのタイプ)は、最大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クラスでは、整数が小さくても役に立つ!
任意のデータ
BigIntegerオブジェクトを任意のデータに変換することもできます。MemoryBlockオブジェクトに変換します。次の例は、文字列をMemoryBlockオブジェクトを経由してMemoryOutputStreamオブジェクト)、そしてBigIntegerそして、最終的にはStringオブジェクトを経由してMemoryBlockオブジェクトがある:
void runExample()
{
logMessage ("------------------------- START --------------------------");
juce::String originalText ("BigInteger objects are really useful for cryptography");
logMessage ("Original text: ");
logMessage (originalText);
logMessage (newLine);
juce::MemoryOutputStream originalData;
originalData << originalText;
juce::BigInteger originalInteger;
originalInteger.loadFromMemoryBlock (originalData.getMemoryBlock());
logMessage ("Original text as a BigInteger: ");
logMessage (originalInteger.toString (10));
logMessage (newLine);
juce::MemoryBlock convertedData (originalInteger.toMemoryBlock());
juce::String convertedString (convertedData.toString());
logMessage ("BigInteger converted back to a string: ");
logMessage (convertedString);
logMessage ("----------------------- FINISHED -------------------------");
}
newLineNewLine newLineA predefined object representing a new-line, which can be written to a string or stream.
アプリケーションのメッセージにある通りだ、BigIntegerオブジェクトは暗号解読に本当に役に立つ。そのRSAKeyクラスはその暗号アルゴリズムをBigIntegerオブジェクトを使用してメッセージを暗号化・復号化する。
上のコードで文字列を変えて実験してみてください。例えば、長い文字列や短い文字列を使うとどうなるでしょうか?
概要
このチュートリアルではBigIntegerクラスです。このチュートリアルに従うと、次のことができるようになります:
- 用途BigIntegerオブジェクトに整数を格納し、通常の整数と同様に算術演算を適用する。
- を変換する。BigIntegerオブジェクトを文字列に変換し、2進数、10進数、16進数、8進数で表示します。
- の各ビットをテストし、設定する。BigIntegerオブジェクトがある。
- 文字列やその他の任意のデータを、以下のように変換する。BigIntegerオブジェクトがある。