Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

JavaScript 右シフト >> と >>> の違い

「新年の初めだからびしっといくぞ」という顔をしている柴犬です。

概要

お正月は何かしなければならないこともなく、テレビを見ることもなく、かなり時間が空きます。

ふと、基本書を読んでみようと思い、まず読んだのが次の本です。

一度は読んだのですが、記憶に残っていないところがほとんどで、知識を見直すことができました。

お正月の第一日目を大変有意義に過ごすことができました。

独学するものにとって貴重な本です。他の本なら省略されているところを丁寧に説明しています。

私の基本書です。

右シフト演算子 >>

定義

左のオペランド(10または-10)を右のオペランド(2)で指定されたビット数だけ右にずらします。
右にずらしてあふれたビット(10)は廃棄されます。
最も左のビット(0または1)をコピーして右にずれて先頭に挿入されます。
従って、符号ビットは変化しません。

恥ずかしいことに、私は次のことが頭から抜け落ちておりました。
改めて基本書をお見直して知りました。

最も左のビット(0または1)をコピーして右にずれて先頭に挿入されます。

ここで、疑問がひとつ思い浮かびました。

負の場合、-10のように1111111111110110と符号の次1の場合はいいが、-32762のように1000000000000110符号の次が0の場合はどうなるのだろう。

実際に確かめてみました。

下のようになり、関係性は崩れていません。

-32762(1000000000000110)を-32768(1000000000000000)と6(0000000000000110)に分けて考えてみます。

-32768を定義に従って2シフトすると1110000000000000となります。これは-8192で-32768を4で割った値です。

6を定義に従って2シフトすると0000000000000001となります。これは1です。算術は1.αです。(αは小数点以下の部分)

-32762を右に2シフトするということは、-8192 + 1 = -8191 (算術は-8190.β)となります。(βは小数点以下の部分)

負の表現がうまいこと考えられていますね。

符号なし右シフト(ゼロ埋め右シフト)>>>

定義

左のオペランド(-32762)を右のオペランドで指定されたビット数(2)だけ右にずらします。
右にずらしてあふれたビットは廃棄されます。
0 のビットが左からずれて入ります。
符号ビットは 0 になりますので、結果は負の数にはなりません。

これまで、このことを知りませんでした。

このことを >> と思っていました。