メインコンテンツまでスキップ

チュートリアルBigInteger クラス

📚 Source Page

このチュートリアルでは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オブジェクトがある。

参照