「JavaScript/ビット演算」の版間の差分
削除された内容 追加された内容
→ビット演算: ビット演算を行う前にNumber型の値を一度32ビットの整数に変換をすることである。 これは、JavaScriptの数値型は倍精度浮動小数点型(64ビットFloat)で、仮数部が53ビットで、それ以下の2の冪乗が32ビットという理由からである。 タグ: 2017年版ソースエディター |
語尾の統一 タグ: 2017年版ソースエディター |
||
4 行
== ビット演算 ==
{{Wikipedia|ビット演算}}
JavaScriptには、2進数(ビットパターン)を操作するためのビット演算子が用意されてい
=== ビット演算 ===
JavaScriptはビット(二値)演算をサポートしてい
* & ビットごとのAND(論理積)
27 行
* >>>= 符号なし右シフト演算子
JavaScriptでビット演算を行ううえで注意すべきことは、ビット演算を行う前にNumber型の値
これは、JavaScriptの数値型は倍精度浮動小数点型(64ビットFloat)で、仮数部が53ビットであり、それ以下で最大の2の冪乗が32ビットという理由からで
=== 2進法の表記法 ===
コンピューターは、その回路構成を単純にするため通常内部的に2進法を用いているため、2進数で計算できるものはこちらで計算した方が高速に動作するため、通常こちらを利用します。
▲二進法とは、10進法とは違い2の倍数で桁上げを行う数の表記法である。理解のために、10進法と、2進、での数の表記の対応表、さらに8進法」、16進法の表記を載せる。
{| class="wikitable"
137 ⟶ 134行目:
2進法は、小さな数でも桁数が多いため、記述を短く簡単に抑えるため通常は16進法を使って記述を行う。
16進法では、9を超える数には順にa,b,c,d,e,fと記号を振ってあり1~15までを一桁で表せ
16進法を使用する場合には、数字の前に0xを付けて表記します
過去のJavaScriptの標準仕様で、C言語と同じ 0 を前置する8進法表記が可能であるがECMA-262第3版で削除された。
147 ⟶ 144行目:
=== 補数 ===
補数とは2進法で、負の値を表現するための非常に巧みな方法であるが、アセンブラでのプログラム等非常に低レベルでのプログラミング以外で実際に使用される事は稀で
簡単のため、この項の解説はあえて省略をします
{{See also|w:補数}}
=== ビットシフト ===
ビットシフトとは、2進数のビットをそのまま、右側、または左側にずらすことを言う。空いたビットには0が埋められ
これは実質、2の倍数の乗算、余算に等しい。ただし、こちらの方が高速に動作します
<nowiki>
160 ⟶ 157行目:
0xd >> 2; // 10進法では13。2進法で「1101」これを右シフトして2進数で「11」、つまり10進法の3が返る </nowiki>
JavaScriptではビットシフトを行っても正負の記号は保存され
しかし、符号なし右シフト演算子(>>>)を使った場合にはこの結果は異な
<nowiki>
-10 >> 1; // -5が返る
-10 >>> 1; // 2147483643が返る </nowiki>
これは、先頭にある正負の記号を表すビットもシフトさせるためで
=== 論理演算 ===
172 ⟶ 169行目:
実際には、ビット積とビット和を使用することが多いのでこちらに解説の重点を置く。
論理積を例に挙げ
論理積の結果を表に表すと次の様になってい
{| class="wikitable"
198 ⟶ 195行目:
|}
論理積の演算子は"&"であるから、実際の演算を行うと次の様にな
<nowiki>
1 & 1; // 1が返る
205 ⟶ 202行目:
0 & 0; // 0が返る </nowiki>
同じように、論理和、排他的論理和の計算結果を挙げると次の様になってい
<nowiki>
// 論理和の演算
221 ⟶ 218行目:
{{See also|w:ブール代数|w:ビット演算}}
これらの演算はビットごとに行われるため、通常の四則演算とは違った考え方で結果を捉える必要があ
例として10進数で7を挙げ
同じように2も2進数では「10」と表記されるため、このビット積「7&2」は、ビットごとの計算が行われるため次の様にな
{| class="wikitable"
251 ⟶ 248行目:
7 & 2; // 2進数では111 & 010 、この結果は2進数で「010」なので「2」である </nowiki>
この性質を利用すればビット積で末尾1ビットを残すことで、奇数、偶数の判別が可能で
この様にして必要なビットのみを取り出す操作を[[w:ビットマスク|ビットマスク]]と呼ぶ。
<nowiki>
num & 1; // 1なら奇数、0なら偶数 </nowiki>
0となった値を1にするにはビット和を利用します
<nowiki>
266 ⟶ 263行目:
この仕掛けを利用すれば、一つの数字データに複数のデータを格納できる事に気づく。
例えば、コンピュータ内部で色を扱う場合の例で、数値型データの中から、32ビットの数値を8ビットごとに区切ってそれぞれ、赤、緑、青、透明度を格納してい
(これをARGB系と呼んでい
取り出す場合には、次の様にコードを記述します
<source lang="javascript">
286 ⟶ 283行目:
実際にはビット演算には他にも数多くのテクニックが存在するが、今回のその解説は省略した。
JavaScriptでのプログラミングでは、スクリプトの評価の方が処理時間をとっているためC言語等の様に高速化手法としては使われないです。
そのため、InternetExplolerでActiveXオブジェクトとのデータのやりとりなど、他の言語環境とのデータのやり取りに使われることもあるが、実際にこれらの演算手法を使う機会は他の言語より少ないです。
基本的には、配列などの他の方法を使うよりこちらの方が鮮やかに記述できる場合に利用すべきで
{{コラム|世界最初のコンピューターは二進法でない!?|
297 ⟶ 294行目:
{{Main|w:ENIAC}}
}}
{{NavNav}}
[[Category:JavaScript|ひつとえんさん]]
|