2017-03-23 3 views
2

私はJavaScriptでいくつかの一般的なアルゴリズムの実装を検討し、クイックソートを探している間、この1を見つけましたよ: https://rawgit.com/escherba/algorithms-in-javascript/master/src/quickmiddle-sort.js理解ビット演算は

それだけでなく、アレイのパーティション機能を実装しています

function partition(array, left, right) { 
     var pivot = array[(left + right) >>> 1]; 
     while (left <= right) { 
      while (array[left] < pivot) { left++; } 
      while (array[right] > pivot) { right--; } 
      if (left <= right) { 
       var temp = array[left]; 
       array[left++] = array[right]; 
       array[right--] = temp; 
      } 
     } 
     return left; 
} 

ビット単位の演算の背後にある数学は何か、私はそれらを持つかなり初心者です。右1によって4

+0

JSで本当に必要なわけではありません。おそらくJavaコードから借用しています* – harold

+0

@harold最適化のためですか? – MattSom

+1

それが意図的に存在すれば、それが唯一可能なことです。 – harold

答えて

2

と仮定を確認するには、二つのオペランドとzero-fill shift right >>> operator 1とビットの追加があります。

たとえば、値が9で、1ビット右にシフトします。

 9 (base 10): 00000000000000000000000000001001 (base 2) 
        -------------------------------- 
9 >>> 1 (base 10): 00000000000000000000000000000100 (base 2) = 4 (base 10) 

結果は4の整数です。

+0

はい、今度はコンソールで試してみました。ありがとう、明確な説明! – MattSom

1

ビット演算は、正確に似ている2 によって左右の値の合計を割ることに他なりません2で割り、自分でテストすることができます。あなたはこの部分

(left + right) >>> 1 

について尋ねている右のバイナリの数値と右シフトを行い、その結果

2

シフトに切り捨て= 2を左右= 7出力が9/2であり、場合

+0

ああ、そうだ。だから、基本的に私たちは分割関数の使用を避ける方が速いのですか? – MattSom

+1

はいバイナリで4を100シフトすると0が最下位ビットになるので、2進数10バイナリで終わるようになります:)通常の分割よりも速くなります – Mero