이러한 메서드를 많이 호출 할 경우 가장 빠른 방법은 비트 조작이 아니라 조회 테이블 일 것입니다. 각 작업에 대해 길이 511의 배열을 정의하십시오. 마이너스 (빼기)의 예
static unsigned char maxTable[511];
memset(maxTable, 0, 255);
maxTable[255]=0;
for (int i=0; i<256; i++)
maxTable[255+i] = i;
배열은 정적이며 한 번만 초기화됩니다. 이제 뺄셈을 인라인 방법이나 사전 컴파일러를 사용하여 정의 할 수 있습니다.
#define MINUS(A,B) maxTable[A-B+255];
어떻게 작동합니까? 서명되지 않은 문자에 대해 가능한 모든 뺄셈을 미리 계산하고 싶습니다. 결과는 -255에서 +255까지 다양하며 총 511 개의 결과가 있습니다. 가능한 모든 결과의 배열을 정의하지만 C에서는 음수 인덱스에서 액세스 할 수 없기 때문에 +255 ([A-B + 255]에서)를 사용합니다. 배열의 중심에 대한 포인터를 정의하여이 작업을 제거 할 수 있습니다.
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
다음과 같이 사용하십시오.
bsub = MINUS(13,15)
실행이 매우 빠릅니다. 결과를 얻기 위해 단 하나의 빼기와 하나의 포인터를 따릅니다. 분기가 없습니다. 정적 배열은 매우 짧기 때문에 계산 속도를 더욱 높이기 위해 CPU 캐시에 완전히로드됩니다.
덧셈에도 동일하게 작동하지만 약간 다른 테이블을 사용합니다 (처음 256 개 요소는 인덱스가되고 마지막 255 개 요소는 255 개 이상의 컷오프를 에뮬레이트하기 위해 255 개와 같습니다.
비트 연산을 고집하면 (a> b)를 사용하는 대답이 잘못되었습니다. 이것은 여전히 분기로 구현 될 수 있습니다. 부호 비트 기술 사용
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
이제 뺄셈과 덧셈 계산에 사용할 수 있습니다.
분기없이 max (), min () 함수를 에뮬레이션하려면 다음을 사용하십시오.
inline __int32 MIN_INT(__int32 x, __int32 y){ __int32 d=x-y; return y+(d&(d>>31)); }
inline __int32 MAX_INT(__int32 x, __int32 y){ __int32 d=x-y; return x-(d&(d>>31)); }
위의 예에서는 32 비트 정수를 사용합니다. 32 비트 계산이 조금 더 빨리 실행된다고 생각하지만 64로 변경할 수 있습니다. 당신까지
y ^ ((x ^ y) & -(x < y))
위한int
유형 평가min(x, y)
분기없이. 이것은 지금까지 가지고있는 것을 기반으로 최종 솔루션의 일부를 형성 할 수 있습니다.