負の整数に対して右ビットシフトを行った場合に処理系依存(C99 以前の C 言語対象)があります。

符号付きデータに対して使った場合の右ビットシフトはコンパイラによって解釈が異なる場合があり、算術シフトを行う処理系と、論理シフトを行う処理系の二種類があります。

GML では右ビットシフトを単なる除算の代用として重宝しないほうが、特に移植性を考慮した場合にも無難かなと筆者は考えています。

GM:S で GML を使う場合、各プラットフォームで異なったコンパイラが利用されるため、処理系依存がある演算子の利用は怖いです。もともとコンパイラの仕様をほとんど知らなくともプログラムとして動くものが作れてしまうソフトですし、GML はインタプリタなので変数は型の概念がユルい。

あるいは正の整数に対してのみ利用するようにするとか。でもそこまでして使う必然性がある?って話になる。※

※ 右ビットシフトは 16進数と組み合わせてマスク処理に使えますが、このブログ記事は二進数への理解を優先するため 16 進数にはあえて触れないという縛りがあるため、マスクについても触れません。

除算

数値に対する右ビットシフトは算術演算子を使った除算と同じ結果を得られます。

例えば正の整数値のビットを右に 1 つシフトすることは、値を 2 で割って剰余を切り捨てる計算(いわゆる割り算で余り切り捨て)と同じ結果を得られます。

var a = 10 >> 1;

変数 a には 5 が返ります。
剰余切り捨てなので計算に余りがある場合、余りは無視されます。

var a = 13 >> 1;

変数 a には 6 が返ります。

算術演算子を使った計算式の場合

var a = floor(13 / 2);

上記式と同じ計算結果を求めるのなら、右ビットシフトを使ったほうが速く処理されます。ただし GML は数値が実数型なので、厳密には floor を使った場合には 6.0 が変数に返っています。

以下は python で再現した例です。

    python_bitwise_right_bit_shift_sample_screenshot_image

記事一覧に戻る ≫

Leave a Reply

Your email address will not be published. Required fields are marked *