読者です 読者をやめる 読者になる 読者になる

サイ本要約 5.8〜5.10.8 ビット演算子など

JavaScript 第5版

JavaScript 第5版

5.8 ビット演算子

JavaScriptの数値のサイズについて

Number -WIKIBOOKS- 整数と浮動小数点数

JavaScriptにおいて、32ビット符号なし整数・32ビット符号付き整数・64ビット浮動小数が1つの数値にまとめられています。C言語などとは異なり、整数同士の演算で32ビットで表現できる範囲を超えた場合は、64ビット浮動小数に自動的に切り替わります。
typeof 演算子のような手法で、この3種のうちどれが使われているかを判定する演算子は存在しません。しかしながら、ビット演算子を使うことにより、64ビット浮動小数を32ビット符号なし整数や32ビット符号付き整数に変換できます。具体的には、>>> 演算子により、32ビット符号なし整数になり、その他のビット演算子により、32ビット符号付き整数に変換されます。64ビット浮動小数は53ビット符号付き整数を誤差なく表現できるため、32ビット符号なし整数や32ビット符号付き整数を意図的に64ビット浮動小数に切り替える方法は JavaScript の言語仕様には存在しません。

このまとめの中では、表組みの可視性を高めるために8ビット符号付き整数として扱うことにする。
(左端の1ビットは符号ビット)

ビット積演算子(AND) &

22 & 115 → 18

0 0 0 1 0 1 1 0
AND 0 1 1 1 0 0 1 1
= 0 0 0 1 0 0 1 0

ビット和演算子(OR) |

22 | 115 → 119

0 0 0 1 0 1 1 0
OR 0 1 1 1 0 0 1 1
= 0 1 1 1 0 1 1 1

ビット排他論理和演算子(XOR) ^

22 ^ 115 → 101

0 0 0 1 0 1 1 0
XOR 0 1 1 1 0 0 1 1
= 0 1 1 0 0 1 0 1

ビット否定演算子(NOT) ~

~115 → -116 *1

0 1 1 1 0 0 1 1
= 1 0 0 0 1 1 0 0

左シフト演算子 <<

115 << 2 → -52

<<2 0 1 1 1 0 0 1 1
= 1 1 0 0 1 1 0 0

※実際は32ビットの整数として扱われるので115 << 2 → 460

符号付き右シフト演算子 >>

115 >> 2 → 28

>>2 0 1 1 1 0 0 1 1
= 0 0 0 1 1 1 0 0

※左端(符号ビット)固定

符号なし右シフト演算子 >>>

115 >>> 2 → 28

>>>2 0 1 1 1 0 0 1 1
= 0 0 0 1 1 1 0 0

5.9 代入演算子

代入演算子 =

op1 = op2

op1 変数、配列要素、オブジェクトプロパティ
op2 任意

代入式の値は右辺の結果になる。
副作用として左辺の変数、配列要素、オブジェクトプロパティは右辺の値を参照するようになる。

算術演算を伴う代入演算子 op=

+= -= *= /= %= <<= >>= >>>= &= |= ^=

// 下記2つの式は同じ意味
total += sales_tax
total = total + sales_tax

5.10 そのほかの演算子

5.10.1 条件演算子 ?:

JavaScript唯一の三項演算子

op1 ? op2 : op3

op1 論理値、または論理値に変換できるもの(通常は比較式)
op2 op1の値がtrueのときの返り値
op3 op1の値がfalseのときの返り値

5.10.2 typeof演算子 typeof

単項演算子

typeof op

opのデータ型 返り値(データ型を示す文字列)
数値型 number
文字列型 string
論理値型 boolean
オブジェクト、配列 object

5.10.3 オブジェクト生成演算子 new

単項演算子

new constructor(引数)

引数がない場合括弧を省略してもよい

5.10.4 delete演算子 delete

単項演算子
オペランドに指定された変数、オブジェクトプロパティ、配列要素を削除される
メモリの解放はガーベジコレクションによって自動的に処理される

delete op

op 返り値
変数、オブジェクトプロパティ、配列要素 削除に成功したらtrue, 失敗ならfalse

delete演算子が削除するのはあくまでプロパティであってプロパティが参照するオブジェクトではない

5.10.5 void演算子 void

void op

op 返り値
任意の値 未定義値undefined

void演算子はJavaScript1.1で実装されているが、undefinedが実装されたのはJavaScript1.5
過去のバージョンとの互換性が必要な場合はvoid 0を使うようにする。

5.10.6 カンマ演算子 ,

左から順にオペランドが評価され、最後に右側のオペランドの値を返す。

i = 0, j = 1, k = 2; // この式が返す値は2

// 下記の記述と大体同じ
i = 0;
j = 1;
k = 2;

式としては1つだが、副作用を伴う独立した式を記述したいときに使う。forループなど。

5.10.7 配列とオブジェクトにアクセスする演算子 [] .

配列の要素にアクセスするときは角括弧 []
オブジェクトの要素にアクセスするときはドット .

5.10.8 関数呼び出し演算子 ()

()演算子は関数を呼び出すときに使用する。

op1(op2)

op1 関数名、関数を参照する式
op2 任意の数の引数。複数の式を指定するときはカンマで区切る。

何を話すか@読書会:

まとめはさくっと流して、ビット演算のいろはや2の補数表現について掘り下げてやろうか考え中。

*1:参考:[http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/fusu.htm:title=負数(2の補数表現)] <実体験から始める情報講座  by kayakaya>