2013-03-21 8 views
2

비트 시프트에 의한 빠른 제곱근 알고리즘을 연구 중입니다. 나는 위키피디아의 코드에 매료되었다.비트 시프트에 의한 제곱근

short isqrt(short num) { 
    short res = 0; 
    short bit = 1 << 14; // The second-to-top bit is set: 1L<<30 for long 

    // "bit" starts at the highest power of four <= the argument. 
    while (bit > num) 
     bit >>= 2; 

    while (bit != 0) { 
     if (num >= res + bit) { 
      num -= res + bit; 
      res = (res >> 1) + bit; 
     } 
     else 
      res >>= 1; 
     bit >>= 2; 
    } 
    return res; 
} 

나는 정확한 결과를 낼 수 있다고 알고 있지만, 어떻게 만들 수 있습니까? 나는이 문장에 특히 혼란 스럽다. res = (res >> 1) + bit; 왜 입술을 2로 나눠야하나요? 누구든지이 문제에 대해 밝힐 수 있습니까? 감사!

+1

'>> 의해 분할 수를 1'비트 단위 우측 시프트, 예를 들어은 "2로 나눈다". '>> 2'는 4로 나누고, >> >> n은 "2로 나누기 ** ** (n)" –

+0

res가 2로 나눈 이유를 설명 할 수 있습니까? – csrfengye

+0

여기에 당신은 당신의 질문 http://stackoverflow.com/questions/10866119/what-is-the-fastest-way-to-find-integer-square-root-using-bit-shifts에 대한 설명을 찾을 수 있습니까? rq = 1 – Rd7

답변

-3

비트 (1)에 의해 우측 시프트 2.

+1

예, 알고 있습니다. 하지만 왜 res는 2로 나눠야합니까? – csrfengye