2017-03-23 1 views
2

나는 자바 스크립트의 몇 가지 일반적인 알고리즘 구현을 공부하고, 퀵 찾고있는 동안이 하나 발견 해요 : 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; 
} 

bitwise 연산 뒤에있는 수학이 무엇인지 궁금합니다. 오른쪽 1 4.

+0

JS에서 실제로 필요하지는 않습니다. 아마도 자바 코드에서 빌려온 것일 것입니다 * – harold

+0

@harold 최적화 목적입니까? – MattSom

+1

의도적으로 있다면 그게 유일한 방법입니다. – harold

답변

2

한다고 가정에게 오른쪽 시프트를하고 확인, 당신은 두 개의 피연산자의 덧셈과 한 비트와 zero-fill shift right >>> operator이 있습니다이 부분

(left + right) >>> 1 

에 대해 요구하고있다.

예를 들어 값이 9이고 한 비트가 오른쪽으로 시프트됩니다.

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

결과 4의 정수이다.

+0

예, 콘솔에서 지금 시도해 보았습니다. 고맙습니다, 명확한 설명! – MattSom

1

비트 연산 정확히 같다 2. 의해 좌우 값의 합을 나눔 뿐이다 2로 나누면 혼자서 테스트 할 수 있습니다. 바로 바이너리의 수와는 결과

2

시프트 절단 = 2를 좌우 = 7 출력이 9/2이고 경우

+0

아, 알겠습니다. 그래서 기본적으로 우리는 나누기 함수의 사용을 피하는 것이 더 빠릅니까? – MattSom

+1

예 이진수 4는 100 시프트입니다. 0은 최하위 비트이므로 2 자리 10 진수로 끝납니다. 보통 분할보다 빠릅니다. – Mero