2 進/8 進/10 進/16 進数の整数演算

ここでは、DIRECT モードを使用した、2 進/8 進/10 進/16 進数の整数演算を扱います。

- 目次 -

数値ごとに異なる種類(型)を混在させる「 DIRECT 」モード

演算モード項目で「 DIRECT 」モードを選択

ここまでは、入力された数値をすべて小数として扱う、F モードと VF モードのみに絞って解説してきました。 その理由は、それらが電卓ソフトとして分かりやすい挙動をするからです。 対して、ここで扱う「 DIRECT 」モードは、電卓というよりはプログラミング言語に近い挙動をするため、 慣れないと少し分かり辛い挙動をします。しかし、2 進数や 16 進数などが扱えるなど、強力な特徴もあります。

DIRECT モードでは、一行の数式の中でも、数値ごとに異なる種類(型)のものとして扱われます。 特にリニアンプロセッサーで常用するのは、 整数(int 型)小数(float 型)という 2 種類が挙げられます。 例えば、以下の数式において、「21」は整数、「1.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 」にした上で実行してみてください。

- 入力 -
0xff

これは 16 進数で「ff」、つまり 10 進数の「255」と同じ数値です。なお、16 進法での一桁は:

1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f

というように表します。 10 進法では 9 の次に 10 に繰り上がりますが、16 進法では 16 ではじめて次の桁に繰り上がります。 つまり 16 進数の f は 15 を意味し、16 進数の 10 は 16 を意味します。

- 出力 -
255

結果は上の通り、入力値を 16 進数と解釈した上で、それを 10 進数に変換した「255」が得られました。 このように、出力は標準では 10 進数に変換して表示されます。

逆に、普段日常で使っている 10 進数の数を、2 進数/8 進数/16 進数で表示したければ、以下の例のように対応する変換関数で包みます:

- 入力 (2 進数として表示したい場合) -
bin( 255 )

- 入力 (8 進数として表示したい場合) -
oct( 255 )

- 入力 (16 進数として表示したい場合) -
hex( 255 )

これで望む基数で表現した数値が得られます。結果には先頭に「0b」「0」「0x」が付加されます。

上の hex( ) ように、括弧(かっこ)の前に特定のキーワードが付いたものは、数学と同様に関数と呼びます。 ここでの hex 関数は、sin や cos といった、通常の数学関数と同じようなものだと思っても問題ありません。 つまり hex は 括弧の中身を 16 進数に変換する関数という事です。

基数が異なる整数の混合演算

整数の四則演算では、異なる基数(16 進数と 10 進数など)の整数を混在させる事が可能です (内部処理ではすべて 2 進数に変換して扱われます)。

- 入力 (16 進数と 10 進数の混合四則演算) -
0xf2 + 14

- 出力 -
256

このように、16 進数の 0xf2(10 進数で 242)と、10 進数の 14 で加算を行い、正しい答えとして256 を得られました。

これを 16 進数で表示するには、全体を hex( ) で囲みます。

- 入力 (16 進数と 10 進数の混合四則演算結果を 16 進数で表示) -
hex( 0xf2 + 14 )

- 出力 -
x100

この通り、256 を 16 進法で表現した正しい答え「100」を得ました。 先頭の 0x は、それが 16 進数である事を現すだけで、読む際は数に含めない事に注意してください。

整数と小数の混合演算

整数と小数を混在させた演算も可能です。10 進数同士だけでなく、他のものも混在可能です。

- 入力 -
0x100 * 1.7

- 出力 -
435.2

0x100(10 進数の 256 と同じ) に 1.7(10 進数) を掛けた結果が、10 進数として表示されました。 このように、整数と小数の混合演算では、結果は小数として扱われるというルールがあります。

なお、これをそのまま 16 進数にしようと hex( )で囲うとエラーとなります。 なぜなら hex( ) 関数は、括弧の中身が必ず整数でなければ受け付けない という決まりになっているからです。 つまり小数を 10 進数以外で表示する事はできません。

しかしどうしても必要な場合には、以下のようにして 小数点以下を切り捨て、無理やり整数に変換して使う事もできます。 これはキャストと呼ばれる強引な演算で、切捨ての分だけ精度が落ちます:

- 入力 -
hex( (int)( 0x100 * 1.7 ) )

- 出力 -
0x1b3

このように、(int)( ) で囲った中身の小数点以下が切り捨てられ、435になったうえで、 それを 16進法で表現した結果が得られました。

ビットごとの論理演算 ( ビット AND、 ビット OR、 ビット XOR )

整数では、「 ビットごとの論理演算 」という、特殊な演算を扱う事ができます。 これはやや専門的な分野で使われるものであり、 一般には馴染みが無いため、あまり深くまで踏み込んだ解説は割愛します。

リニアンプロセッサーでは、ビットごとの論理演算は、演算子ではなく関数として提供されます。 これは、C 言語系の言語でビット排他的論理和にマッピングされる「 ^ 」演算子が、 一般の電卓ソフトではべき乗(指数)の演算子として普及しているため、誤用を避けるための仕様です。

and( )がビット論理積、or( )がビット論理和、xor( )がビット排他的論理和を返す関数です。 これらはパラメータ(引数)を 2 つ要するので、コンマ記号「 , 」で区切って記述します。

※ これらの関数は、「 設定 」 > 「 カンマ付き数値 」項目を OFF にしないとエラーになります。

- 入力 -
bin( or( 0b101010 , 0b010101 ) )

- 出力 -
0b111111

このように、2 つの 2 進数「101010」と「010101」に対して、ビット(2 進数での桁)ごとに論理和 (どちらか片方でも 1 なら 1 になる)をとった結果「111111」が得られました。 なお、and を使うとビットごとの論理積(両方 1 の場合だけ 1 になる)となり、 0 ( 0b0 ) が得られます。

整数同士の除算(割り算)には注意が必要

DIRECTモードで整数同士で除算(割り算)を行う場合には、注意が必要です。

詳細は「VCSSL のプログラミングガイド」フォルダ内のガイド参照ですが、 いくつかのプログラミング言語(C 言語も)では、整数同士の演算は整数になるというルールがあり、 それにより、整数同士の除算では、結果の小数点以下が切り捨てられます。 これはDIRECTモードでも同様です。

つまりDIRECTモードでは、1/2 が 0 になります。

このルールは慣れるまでミスを招きがちなため、注意が必要です。