Esto solo funciona para enteros de 32 bits, por supuesto.
k=c>>31&1
aísla el bit de signo, que es 0 ó 1.
Si k
es 0, entonces a>=b
y max = a - 0*(a-b) = a
.
Si k
es 1, a continuación, a<b
y .
Históricamente, la canalización de instrucciones era la razón principal para usar código que evita una prueba if
. Si la canalización es profunda y el procesador no utiliza la predicción de bifurcación, una media docena de operaciones enteras puede tomar menos tiempo para hacerlo que el tiempo perdido debido a la recarga de la tubería y el manejo de tiendas especulativas, si las hay. Con la predicción de bifurcación, el código con if
(o equivalente) podría ser más rápido. De cualquier manera, el costo de los nanosegundos guardados o perdidos nunca excederá los costos de mantenimiento del programa para ese código.
Nota, esto funciona para Java y C#. * Puede * funcionar para C y C++, pero cambiar un número negativo es un comportamiento técnicamente indefinido para esos dos. No culpes a nadie más que a ti mismo si un demonio sale volando de tu nariz. – cHao
El comportamiento está definido por la implementación, no está indefinido. Los demonios nariz no serán observados. –