Si llama mucho a esos métodos, la forma más rápida no sería la manipulación de bits, sino probablemente una tabla de búsqueda. Defina una matriz de longitud 511 para cada operación. Ejemplo de menos (resta)
static unsigned char maxTable[511];
memset(maxTable, 0, 255);
maxTable[255]=0;
for (int i=0; i<256; i++)
maxTable[255+i] = i;
La matriz es estática y se inicializa solo una vez. Ahora su resta se puede definir como método en línea o usando el precompilador:
#define MINUS(A,B) maxTable[A-B+255];
¿Cómo funciona? Bueno, desea calcular previamente todas las posibles sustracciones de caracteres sin firmar. Los resultados varían de -255 a +255, total de 511 resultados diferentes. Definimos una matriz de todos los resultados posibles, pero como en C no podemos acceder a ella desde índices negativos, usamos +255 (en [A-B + 255]). Puede eliminar esta acción definiendo un puntero al centro de la matriz.
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
úsalo como:
bsub = MINUS(13,15)
Tenga en cuenta que la ejecución es extremadamente rápida. Solo una resta y una deferencia de puntero para obtener el resultado. Sin ramificaciones. Las matrices estáticas son muy cortas, por lo que se cargarán completamente en la memoria caché de la CPU para acelerar aún más el cálculo.
Lo mismo funcionaría para la adición pero con una tabla un poco diferente (los primeros 256 elementos serán los índices y los últimos 255 elementos serán iguales a 255 para emular el límite más allá de 255.
Si insiste en la operación de bits, las respuestas que usan (a> b) son incorrectas. Esto todavía podría implementarse como ramificación. Usa la técnica del bit de signo
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
Ahora puedes usarlo para calcular restas y sumas.
Si desea emular las funciones max (), min () sin ramificar, use:
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)); }
Mis ejemplos anteriores usan números enteros de 32 bits. Puede cambiarlo a 64, aunque creo que los cálculos de 32 bits se ejecutan un poco más rápido. Depende de usted
y ^ ((x ^ y) & -(x < y))
paraint
tipos se evalúamin(x, y)
sin ramificar. Esto podría formar parte de una solución eventual, basada en lo que tiene hasta ahora.