Якщо ви будете часто називати ці методи, найшвидшим способом буде не маніпуляція з бітами, а, мабуть, пошукова таблиця. Визначте масив довжиною 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)
без розгалуження. Це може стати частиною можливого рішення, виходячи з того, що у вас є на сьогодні.