2011-03-01 4 views
1

AS3에서 다음 링크에 설명 된 Round Up Power of 2 알고리즘을 구현하려고했습니다. AS3의 두 알고리즘의 위력 구현

http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2

public static function upperPowerOfTwo(num:uint):uint 
{ 
// if(num == 1) return 2; 

    num--; 
    num |= num >> 1; 
    num |= num >> 2; 
    num |= num >> 4; 
    num |= num >> 8; 
    num |= num >> 16; 

    num++; 

    return num; 
} 

알고리즘은 내가 테스트 한 값의 가장 위대한 작품. 기술적으로 부정확 한 0의 입력 값이 주어지면 0을 반환하지만 그 출력은 정상입니다. 내가 싫어하는 부분은 1의 입력을 받아서 1을 출력 할 때이다.

나는 이것이 AS3의 경고문이고 그 위키의 구현체가되어야한다고 생각한다. 그것. 나는 또한 >>> 논리 시프트 연산자를 사용하여 같은 결과를 얻으려고 시도했다.

내 C는 약간 녹슬었지만 C로 2를 반환하는 방법을 모르겠다. 누군가 나에게 설명 할 수있는 부분이 잘못 되었습니까? 1의 입력이 위의 링크에서 언급되었을 특별한 경우라고 가정합니다.

+1

이 기능을 여러 번 보았습니다. 나는 그것을 전혀 좋아하지 않는다. 저장 가능한 값의 거의 절반 전체가 0이됩니다. 손실 된 값이 많습니다. 불행히도 그 해결책은 없습니다. 이 기능은 실제로 지적 된대로 @ TonyK가 지적한대로 작동합니다. 1은 2를 반환하지 않습니다. 왜냐하면 1 비트가 inital'num -;에 의해 stomp되어 0을 갖기 때문입니다.'num | ='줄은 아무 것도하지 않고'num ++'는 다시 최대 1을 넣습니다 . –

답변

2

무엇이 문제입니까? 1은 2의 거듭 제곱입니다 : 2^0과 같습니다. 알고리즘은 광고 된대로 작동합니다.

+0

아! 네가 옳아. 나는 정말로 약간의 잠을 취할 필요가있다! – mbaker3