2 進/8 進/10 進/16 進数の整数演算
ここでは、DIRECT モードを使用した、2 進/8 進/10 進/16 進数の整数演算を扱います。
数値ごとに異なる種類(型)を混在させる「 DIRECT 」モード
ここまでは、入力された数値をすべて小数として扱う、F モードと VF モードのみに絞って解説してきました。 その理由は、それらが電卓ソフトとして分かりやすい挙動をするからです。 対して、ここで扱う「 DIRECT 」モードは、電卓というよりはプログラミング言語に近い挙動をするため、 慣れないと少し分かり辛い挙動をします。しかし、2 進数や 16 進数などが扱えるなど、強力な特徴もあります。
DIRECT モードでは、一行の数式の中でも、数値ごとに異なる種類(型)のものとして扱われます。 特にリニアンプロセッサーで常用するのは、 整数(int 型)と小数(float 型)という 2 種類が挙げられます。 例えば、以下の数式において、「21」は整数、「1.2」は小数として扱われます。
- 入力 -このように、 小数の場合は「 小数点があれば少数として扱われる 」という、分かりやすいルール があります。これに対して、少しややこしいのは整数です。
整数には、何進法で記述するかによって、複数の記述法がある
整数には、以下のように複数の記述ルールがあります。
基数 | 例(括弧内は10進数記法) | 記述ルールの詳細 |
---|---|---|
10 進数 | 12345 (12345) | 普通に整数を記述する(小数点は付けない)。 |
2 進数 | 0b1010010 (82) | 先頭に「0b」を付け、それ以降を 2 進数で記述する。 |
8 進数 | 0o23532 (10074) | 先頭に「0o」を付け、それ以降を 8 進数で記述する。 |
16 進数 | 0x12ac14 (1223700) | 先頭に「0x」を付け、それ以降を 16 進数で記述する。 |
このように整数では、10 進数(10 進法で記述した数)の場合を除いて、先頭に特殊な表記を付加します。 そうすると、その通りにリニアンプロセッサーに解釈され、扱われます。
例として、16 進数(16 進法で記述した数)の整数を使用してみましょう。「入力」欄に以下のように記述し、 その下の「 演算モード 」項目を「 DIRECT 」にした上で実行してみてください。
- 入力 -これは 16 進数で「ff」、つまり 10 進数の「255」と同じ数値です。なお、16 進法での一桁は:
というように表します。 10 進法では 9 の次に 10 に繰り上がりますが、16 進法では 16 ではじめて次の桁に繰り上がります。 つまり 16 進数の f は 15 を意味し、16 進数の 10 は 16 を意味します。
- 出力 -結果は上の通り、入力値を 16 進数と解釈した上で、それを 10 進数に変換した「255」が得られました。 このように、出力は標準では 10 進数に変換して表示されます。
逆に、普段日常で使っている 10 進数の数を、2 進数/8 進数/16 進数で表示したければ、以下の例のように対応する変換関数で包みます:
- 入力 (2 進数として表示したい場合) -- 入力 (8 進数として表示したい場合) -
- 入力 (16 進数として表示したい場合) -
これで望む基数で表現した数値が得られます。結果には先頭に「0b」「0」「0x」が付加されます。
上の hex( ) ように、括弧(かっこ)の前に特定のキーワードが付いたものは、数学と同様に関数と呼びます。 ここでの hex 関数は、sin や cos といった、通常の数学関数と同じようなものだと思っても問題ありません。 つまり hex は 括弧の中身を 16 進数に変換する関数という事です。
基数が異なる整数の混合演算
整数の四則演算では、異なる基数(16 進数と 10 進数など)の整数を混在させる事が可能です (内部処理ではすべて 2 進数に変換して扱われます)。
- 入力 (16 進数と 10 進数の混合四則演算) -- 出力 -
このように、16 進数の 0xf2(10 進数で 242)と、10 進数の 14 で加算を行い、正しい答えとして256 を得られました。
これを 16 進数で表示するには、全体を hex( ) で囲みます。
- 入力 (16 進数と 10 進数の混合四則演算結果を 16 進数で表示) -- 出力 -
この通り、256 を 16 進法で表現した正しい答え「100」を得ました。 先頭の 0x は、それが 16 進数である事を現すだけで、読む際は数に含めない事に注意してください。
整数と小数の混合演算
整数と小数を混在させた演算も可能です。10 進数同士だけでなく、他のものも混在可能です。
- 入力 -- 出力 -
0x100(10 進数の 256 と同じ) に 1.7(10 進数) を掛けた結果が、10 進数として表示されました。 このように、整数と小数の混合演算では、結果は小数として扱われるというルールがあります。
なお、これをそのまま 16 進数にしようと hex( )で囲うとエラーとなります。 なぜなら hex( ) 関数は、括弧の中身が必ず整数でなければ受け付けない という決まりになっているからです。 つまり小数を 10 進数以外で表示する事はできません。
しかしどうしても必要な場合には、以下のようにして 小数点以下を切り捨て、無理やり整数に変換して使う事もできます。 これはキャストと呼ばれる強引な演算で、切捨ての分だけ精度が落ちます:
- 入力 -- 出力 -
このように、(int)( ) で囲った中身の小数点以下が切り捨てられ、435になったうえで、 それを 16進法で表現した結果が得られました。
ビットごとの論理演算 ( ビット AND、 ビット OR、 ビット XOR )
整数では、「 ビットごとの論理演算 」という、特殊な演算を扱う事ができます。 これはやや専門的な分野で使われるものであり、 一般には馴染みが無いため、あまり深くまで踏み込んだ解説は割愛します。
リニアンプロセッサーでは、ビットごとの論理演算は、演算子ではなく関数として提供されます。 これは、C 言語系の言語でビット排他的論理和にマッピングされる「 ^ 」演算子が、 一般の電卓ソフトではべき乗(指数)の演算子として普及しているため、誤用を避けるための仕様です。
and( )がビット論理積、or( )がビット論理和、xor( )がビット排他的論理和を返す関数です。 これらはパラメータ(引数)を 2 つ要するので、コンマ記号「 , 」で区切って記述します。
※ これらの関数は、「 設定 」 > 「 カンマ付き数値 」項目を OFF にしないとエラーになります。
- 入力 -- 出力 -
このように、2 つの 2 進数「101010」と「010101」に対して、ビット(2 進数での桁)ごとに論理和 (どちらか片方でも 1 なら 1 になる)をとった結果「111111」が得られました。 なお、and を使うとビットごとの論理積(両方 1 の場合だけ 1 になる)となり、 0 ( 0b0 ) が得られます。
整数同士の除算(割り算)には注意が必要
DIRECTモードで整数同士で除算(割り算)を行う場合には、注意が必要です。
詳細は「VCSSL のプログラミングガイド」フォルダ内のガイド参照ですが、 いくつかのプログラミング言語(C 言語も)では、整数同士の演算は整数になるというルールがあり、 それにより、整数同士の除算では、結果の小数点以下が切り捨てられます。 これはDIRECTモードでも同様です。
つまりDIRECTモードでは、1/2 が 0 になります。
このルールは慣れるまでミスを招きがちなため、注意が必要です。