Función getMax () sin ninguna operación lógica
int getMax(int a, int b){
return (a+b+((a-b)>>sizeof(int)*8-1|1)*(a-b))/2;
}
Explicación:
Vamos a romper el 'máximo' en pedazos,
max
= ( max + max ) / 2
= ( max + (min+differenceOfMaxMin) ) / 2
= ( max + min + differenceOfMaxMin ) / 2
= ( max + min + | max - min | ) ) / 2
Entonces la función debería verse así:
getMax(a, b)
= ( a + b + absolute(a - b) ) / 2
Ahora,
absolute(x)
= x [if 'x' is positive] or -x [if 'x' is negative]
= x * ( 1 [if 'x' is positive] or -1 [if 'x' is negative] )
En un número entero positivo, el primer bit (bit de signo) es 0 ; en negativo es- 1 . Desplazando bits a la derecha (>>) se puede capturar el primer bit.
Durante el desplazamiento a la derecha, el espacio vacío se llena con el bit de signo. Entonces 01110001 >> 2 = 00011100 , mientras que 10110001 >> 2 = 11101100 .
Como resultado, para el cambio de número de 8 bits, 7 bits producirán- 1 1 1 1 1 1 1 [0 o 1] para negativo, o 0 0 0 0 0 0 0 [0 o 1] para positivo.
Ahora, si la operación OR se realiza con 00000001 (= 1) , el número negativo produce- 11111111 (= -1) y positivo- 00000001 (= 1) .
Entonces,
absolute(x)
= x * ( 1 [if 'x' is positive] or -1 [if 'x' is negative] )
= x * ( ( x >> (numberOfBitsInInteger-1) ) | 1 )
= x * ( ( x >> ((numberOfBytesInInteger*bitsInOneByte) - 1) ) | 1 )
= x * ( ( x >> ((sizeOf(int)*8) - 1) ) | 1 )
Finalmente,
getMax(a, b)
= ( a + b + absolute(a - b) ) / 2
= ( a + b + ((a-b) * ( ( (a-b) >> ((sizeOf(int)*8) - 1) ) | 1 )) ) / 2
Otra forma -
int getMax(int a, int b){
int i[] = {a, b};
return i[( (i[0]-i[1]) >> (sizeof(int)*8 - 1) ) & 1 ];
}
<
.