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 になりますので、結果は負の数にはなりません。
これまで、このことを知りませんでした。
このことを >> と思っていました。