2010-02-08 4 views
4

나는 2의 거듭 제곱이 아닌 숫자로 나누기위한 짧은 어셈블러 코드를 작성하기로되어있었습니다. 제 해결책은 사이클에서 디바이더를 빼는 것이었고 사이클의 수는 실제 결과였습니다. 더 빠른 것이 있습니까? 이 문제를 해결하는 일반적인 방법은 무엇입니까?부서는 얼마나 빠릅니까?

+5

어떤 프로세서입니까? 대부분의 내장형 연산 코드는 – Meinersbur

+0

입니다. 숫자를 나누기 위해 뺄셈을 선택하여 가장 가난한 선택을했습니다 :) –

+2

divison opcode가 없더라도 프로세서 아키텍처 나 어떤 지시를 받았는지, 어떤 지시가 빠르는지를 구체적으로 밝히십시오. 사업부가없는 프로세서의 경우 다른 일반적인 opcode가 없거나 느릴 수도 있습니다 (임의 비트 시프트 및 곱셈이 마음에 들었습니다). 일부 알고리즘에 영향을 줄 수 있습니다. 그러나 첫 번째 질문에 답하기 위해 : 네, 이런 종류의 알고리즘이 더 빠릅니다. – Grizzly

답변

2

반복되는 빼기는 나누기를 위험하게 비효율적 인 방법입니다. 최악의 경우 N 비트 단위로 O(2**N)을 사용할 수 있습니다!

@ Johannes 대답에는 그보다 훨씬 나은 알고리즘을 제공하는 링크가 있습니다.

어셈블러에서 부서를 구현하도록 요청 받았으면 기존 루틴 숫자 라이브러리를 광범위하게 검색해야 할 것입니다. 이것은 최적의 코드에 가깝도록 많은 전문 지식을 필요로하는 종류의 문제입니다.

편집 :

그것은 내가 지금 C++에서 일부 프로그램을 만들고있어 그냥 그리고 내가 사용하는 부문은 하나의 문제를 해결하거나 다른 뭔가를 만들어 여부를 결정 해요 : 영업의 코멘트에 응답 빨리하기.

제발 그냥 나누기를 사용하고 특정 대상 플랫폼에 필요한 결과를 얻기 위해 가장 효율적인 명령 시퀀스를 생성하기 위해 C++ 컴파일러에 두는 것이 좋습니다.

2

Wikipedia에는 많은 알고리즘이 언급되어 있습니다.

+0

오 .. 나는 위키 피 디아를 확인하는 걸 잊었 .. 목. – Pyjong

관련 문제