Jeśli będziesz często wywoływał te metody, najszybszym sposobem nie byłaby manipulacja bitami, ale prawdopodobnie tabela przeglądowa. Zdefiniuj tablicę o długości 511 dla każdej operacji. Przykład na minus (odejmowanie)
static unsigned char maxTable[511];
memset(maxTable, 0, 255);
maxTable[255]=0;
for (int i=0; i<256; i++)
maxTable[255+i] = i;
Tablica jest statyczna i inicjowana tylko raz. Teraz odejmowanie można zdefiniować jako metodę inline lub za pomocą prekompilatora:
#define MINUS(A,B) maxTable[A-B+255];
Jak to działa? Cóż, chcesz wstępnie obliczyć wszystkie możliwe odejmowania dla znaków bez znaku. Wyniki wahają się od -255 do +255, łącznie 511 różnych wyników. Definiujemy tablicę wszystkich możliwych wyników, ale ponieważ w C nie mamy do niej dostępu z ujemnych indeksów, używamy +255 (w [A-B + 255]). Możesz usunąć tę akcję, definiując wskaźnik do środka tablicy.
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
użyj go jak:
bsub = MINUS(13,15)
Zwróć uwagę, że wykonanie jest niezwykle szybkie. Tylko jedno odejmowanie i jedno uwzględnienie wskaźnika, aby otrzymać wynik. Bez rozgałęzień. Tablice statyczne są bardzo krótkie, więc zostaną w pełni załadowane do pamięci podręcznej procesora, aby jeszcze bardziej przyspieszyć obliczenia
To samo zadziała w przypadku dodawania, ale z nieco inną tabelą (pierwsze 256 elementów będzie indeksami, a ostatnie 255 elementów będzie równe 255, aby emulować odcięcie powyżej 255.
Jeśli nalegasz na operację na bitach, odpowiedzi, które używają (a> b) są błędne. To nadal może być realizowane jako rozgałęzienie. Użyj techniki znaków bitowych
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
Teraz możesz go użyć do obliczenia odejmowania i dodawania.
Jeśli chcesz emulować funkcje max (), min () bez rozgałęziania użyj:
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)); }
W powyższych przykładach używam 32-bitowych liczb całkowitych. Możesz zmienić to na 64, chociaż uważam, że 32-bitowe obliczenia działają nieco szybciej. Zależy od Ciebie
y ^ ((x ^ y) & -(x < y))
dlaint
typów obliczamin(x, y)
bez rozgałęzień. Może to stanowić część ostatecznego rozwiązania w oparciu o to, co masz do tej pory.