• ベストアンサー

javascriptでビット演算子の「^」を理解する方法を知りたいです。

例えば、こんなものを作ってみましたが、いまいちピンと来なくて。。 どの様な法則の上で動いているのかがわからないです。 そして、何の為に使っているのががわからないです。 javascriptでビット演算を使用するメリットはあるのでしょうか? (処理が早くなる、というのはwikiにも説明があるのでわかりましたが。) 何とぞ、よろしくお願い致します。 x = new Array( 1^0, 1^1, 1^2, 1^3, 1^4, 1^5, 1^6, 1^7, 1^8, 1^9, 1^10, 1^11, 1^12, 1^13, 1^14, 1^15, 1^16, 1^17, 1^18, 1^19, 1^20 ); for (i=0; i<=20; i++){ document.write( i + ":" + x[i] + "<br>" ); }

質問者が選んだベストアンサー

  • ベストアンサー
  • t_netbug
  • ベストアンサー率34% (15/44)
回答No.4

質問者様がまだ見ていらっしゃるかどうかは不明ですが…。 xorの処理をここで纏めてみます。 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 比較したものが同じ値の時、0(false)になり、 比較したものが違う値の時、1(true)となります。 さて、では質問者様の例を考えてみます。 まずは 1^0 これを2進数で考えると以下のようになります。 0001 = 1 0000 = 0 このように縦にして、同じビット同士でxorを行います。 結果は 0001 = 1 0000 = 0 -------- 0001 = 1 となります。 こうした方が分かりやすいですかね…。 0xor0=0 0xor0=0 0xor0=0 1xor0=1 ↓  ↓  ↓ 1  0  1 次に 1^1 で考えてみます。 0001 = 1 0001 = 1 -------- 0000 = 0 となります。 ご提示いただいたものをいくつか2進数に直して計算結果を書いてみます。 0001^0000 (=0001) = 1(1^0の結果) 0001^0001 (=0000) = 0(1^1の結果) 0001^0010 (=0011) = 3(1^2の結果) 0001^0011 (=0010) = 2(1^3の結果) 0001^0100 (=0101) = 5(1^4の結果) 0001^0101 (=0100) = 4(1^5の結果) 0001^0110 (=0111) = 7(1^6の結果) 0001^0111 (=0110) = 6(1^7の結果) 0001^1000 (=1001) = 9(1^8の結果) 0001^1001 (=1000) = 8(1^9の結果) 0001^1010 (=1011) = 11(1^10の結果) 0001^1011 (=1010) = 10(1^11の結果) 0001^1100 (=1101) = 13(1^12の結果) 0001^1101 (=1100) = 12(1^13の結果) ・ ・ 0001^1111 (=1110) = 14(1^15の結果) 00001^10000 (=10001) = 17(1^16の結果) 1^16ですが4桁では表示しきれない値になったので繰り上げしました。 この時、混乱しないように最初のうちは上記のように桁合わせして計算した方が良いと思います。 >mizutaki様 スイマセン、気になったのでつっこませて下さい。 >>XORはビット演算の結果を反転させ 違うと思います。 ビットの反転はNOT(~)だと思います。

その他の回答 (3)

回答No.3

for(y = 1999; y<2010; y++) alert([y,matubi(y,2-1)]); function matubi( y, m ){ return (m^m<7|30)-(m==1)*(1+(y%4>0^y%100>0^y%400>0)); } とかなら?

  • mizutaki
  • ベストアンサー率33% (111/333)
回答No.2

・AND 処理内において複数の関数を呼び出す際に、すべての関数がtrueを返したかを調べる。 この処理だとforの中でif文チェックをするよりは無駄が減ります。 var result = true; for(i=0; i<x; i++){ result &= hogefunc(i); } if(result == true) alert('ok'); else alert('ng'); ・OR 関数の中に複数の値を引き渡す方法で使用することがあります。 javascriptと違って開発規模が大きい言語でよく使われる手法。 // DEFAULT_xxx は全体参照として設定されていて、2のn乗の重複しない数値が振り分けられている function hogefunc( i ){ var str = ''; if( i & DEFAULT_NUM == DEFAULT_NUM ) str = str + '1234567890'; if( i & DEFAULT_S_ALPHA == DEFAULT_S_ALPHA ) str = str + 'abcdefghijklmnopqrstuvwxyz'; if( i & DEFAULT_B_ALPHA == DEFAULT_B_ALPHA ) str = str + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; return str; } hogefunc( DEFAULT_NUM | DEFAULT_S_ALPHA ); // 数値とアルファベット小文字が返ってくる hogefunc( DEFAULT_B_ALPHA ); // アルファベット大だけが返ってくる XORはビット演算の結果を反転させ、 シフト演算はビット演算の結果の取得などに使ったりするのですが、 intが32ビットを扱えないという制限があるせいで、なかなか使えなかったりしますね。 ビット演算の利用方法はいろいろとありますので、いろんな応用にも使えるかと思います。 後、Javascriptが少し久しぶりなので参考用の処理が間違ってるかもしれませんけど。 なんとなく利用パターンは分かるんじゃないかなと。

参考URL:
http://utsukemononi.gozaru.jp/gc/page25.html
  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

>どの様な法則の上で動いているのかがわからないです。 二進数で各位をビット演算(^の場合xor)計算すればわかる。 ※()内は10進数表記 1^0 ⇒1 xor 0 = 1 1^1 ⇒1 xor 1 = 0 1^2 ⇒01 xor 10 = 11 (3) 1^3 ⇒01 xor 11 = 10 (2) 5^3 ⇒101 xor 011 = 110(6) >何の為に使っているのががわからないです。 >javascriptでビット演算を使用するメリットはあるのでしょうか? 必要な人は必要。 必要でない(わからない)人に説明するのは大変なので省略。 まぁたしかにJavascriptでビット演算を使うことはほとんどないだろうね。 文法の似ているCやJavaも同じ演算子だから、文法を参考にしたときに 同じように残したんだろうね。 Cなら今でもビット演算子を使うことはある。 詳しく知りたいならアセンブラとか低水準言語をやってみるといい。

関連するQ&A