「JavaScript/ビット演算」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎ビット演算: ビット演算を行う前にNumber型の値を一度32ビットの整数に変換をすることである。 これは、JavaScriptの数値型は倍精度浮動小数点型(64ビットFloat)で、仮数部が53ビットで、それ以下の2の冪乗が32ビットという理由からである。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
語尾の統一
タグ: 2017年版ソースエディター
4 行
== ビット演算 ==
{{Wikipedia|ビット演算}}
JavaScriptには、2進数(ビットパターン)を操作するためのビット演算子が用意されています。これらの演算子は、他の演算子ほど頻繁に使用されるものではないので、必要ない場合はこのセクションを読み飛ばしてもかまわないです
 
=== ビット演算 ===
 
JavaScriptはビット(二値)演算をサポートしています
 
* & ビットごとのAND(論理積)
27 行
* >>>= 符号なし右シフト演算子
 
JavaScriptでビット演算を行ううえで注意すべきことは、ビット演算を行う前にNumber型の値を一度32ビット整数に強制変換をすされということである
これは、JavaScriptの数値型は倍精度浮動小数点型(64ビットFloat)で、仮数部が53ビットであり、それ以下で最大の2の冪乗が32ビットという理由からである
 
ビット演算を既に理解している場合はこれ以降の解説は必要ないと思われるが、プログラミング初学者のために以降はビット演算の基本的な解説を行う。
 
=== 2進法の表記法 ===
 
コンピューターは、その回路構成を単純にするため通常内部的に2進法を用いているため、2進数で計算できるものはこちらで計算した方が高速に動作するため、通常こちらを利用します。
二進法とは、10進法とは違い2の倍数で桁上げを行う数の表記法である。理解のために、10進法と、2進、での数の表記の対応表、さらに8進法」、16進法の表記を載せます
、通常こちらを利用する。
二進法とは、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進数に直すと、「111」となります
同じように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|ひつとえんさん]]