Если вы будете часто вызывать эти методы, самым быстрым способом будет не битовая манипуляция, а, вероятно, таблица поиска. Определите массив длиной 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)
Обратите внимание, что выполнение происходит очень быстро. Только одно вычитание и одно указание, чтобы получить результат. Нет ветвления. Статические массивы очень короткие, поэтому они будут полностью загружены в кеш процессора для дальнейшего ускорения вычислений.
То же самое будет работать для сложения, но с немного другой таблицей (первые 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-битные целые числа. Вы можете изменить его на 64, хотя я считаю, что 32-битные вычисления выполняются немного быстрее. Вам решать
y ^ ((x ^ y) & -(x < y))
дляint
типов оцениваетсяmin(x, y)
без ветвления. Это может стать частью окончательного решения, основанного на том, что у вас есть на данный момент.