2012-04-22 4 views
2

나는 많은 코드를 실행하여 최적화하고 싶다. 그것은 다음과 같습니다빠른 양방향 비트 시프트?

int exponent; 
uint32_t mantissa; 

if (exponent < 0) { 
    return mantissa << -exponent; 
} else { 
    return mantissa >> exponent; 
} 

그것이 오른쪽 시프트 exponent는 음수가 될 수 mantissaexponent에 의해 장소,해야, 목적은 매우 분명하다입니다.

(가능하면 가지가없는) 더 빠르게 코드를 작성할 수 있습니까?

답변

4

물론 있습니다. 즉, 브랜치가없는 브랜치입니다. 모든 상황에서 필연적으로 더 빠르다고 말하지는 않습니다.

int exponent; 
uint32_t mantissa; 

return (uint32_t)((uint64_t)mantissa << (32-exponent) >> 32); 
+0

'mantissa'는 여기 23 비트 정수이고 지수는 [-127, +128] 범위의 다른 흥미로운 정보가있을 수 있습니다. (예, IEEE 754 :). – orlp

+0

+1 : 영리합니다. 가장 큰 네이티브 형식도 64 비트 길이 인 컴퓨터에서 mantissa가 더 큰 (64 비트) 비슷한 트릭이 없다고 가정합니다. –

0

"integer abs without branching". 이 사람은 당신이 원한 것을 포함하여 비트 트릭을 많이 가지고 있습니다. 'exponent'변수 유형이 절대로 변경되지 않으면 'sizeof (int) * CHAR_BIT'가 8로 대체되어야합니다.

그런데이 'if'문이 분기로 인한 성능 문제인지 확인 하시겠습니까? 제 말은 문제가 다른 곳의 가난한 데이터 지역에있는 경우 지점을 최적화하는 데 아무런 의미가 없다는 것입니다.

관련 문제