Se você chamar muito esses métodos, a maneira mais rápida não seria a manipulação de bits, mas provavelmente uma tabela de consulta. Defina uma matriz de comprimento 511 para cada operação. Exemplo para menos (subtração)
static unsigned char maxTable[511];
memset(maxTable, 0, 255);
maxTable[255]=0;
for (int i=0; i<256; i++)
maxTable[255+i] = i;
A matriz é estática e inicializada apenas uma vez. Agora sua subtração pode ser definida como método inline ou usando o pré-compilador:
#define MINUS(A,B) maxTable[A-B+255];
Como funciona? Bem, você deseja pré-calcular todas as subtrações possíveis para caracteres não assinados. Os resultados variam de -255 a +255, total de 511 resultados diferentes. Definimos uma matriz de todos os resultados possíveis, mas como em C não podemos acessá-la a partir de índices negativos, usamos +255 (em [A-B + 255]). Você pode remover esta ação definindo um ponteiro para o centro da matriz.
const unsigned char *result = maxTable+255;
#define MINUS(A,B) result[A-B];
use-o como:
bsub = MINUS(13,15)
Observe que a execução é extremamente rápida. Apenas uma subtração e uma deferência de ponteiro para obter o resultado. Sem ramificação. Os arrays estáticos são muito curtos, então eles serão totalmente carregados no cache da CPU para acelerar ainda mais o cálculo
O mesmo funcionaria para adição, mas com uma tabela um pouco diferente (os primeiros 256 elementos serão os índices e os últimos 255 elementos serão iguais a 255 para emular o corte além de 255.
Se você insiste na operação de bits, as respostas que usam (a> b) estão erradas. Isso ainda pode ser implementado como ramificação. Use a técnica do bit de sinal
#define is_int_biggerNotEqual( num1,num2) ((((__int32)((num2)-(num1)))&0x80000000)>>31)
Agora você pode usá-lo para cálculo de subtração e adição.
Se você quiser emular as funções max (), min () sem ramificação, 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)); }
Meus exemplos acima usam inteiros de 32 bits. Você pode alterá-lo para 64, embora eu acredite que os cálculos de 32 bits sejam um pouco mais rápidos. Você decide
y ^ ((x ^ y) & -(x < y))
paraint
tipos avaliamin(x, y)
sem ramificação. Isso pode fazer parte de uma solução eventual, com base no que você tem até agora.