int getMax(int a, int b) {
int c = a - b;
int k = (c >> 31) & 0x1;
int max = a - k * c;
return max;
}
Nous allons disséquer ce. Cette première ligne est simple: il stocke la différence de a
et b
. Cette valeur est négative si l' a < b
et est non négatif sinon.
Dans la ligne suivante:
int k = (c >> 31) & 0x1;
l'idée est de vérifier si la valeur de c
est négatif. Dans pratiquement tous les ordinateurs modernes, les nombres sont stockés dans un format appelé en complément à deux , dans lequel le bit le plus élevé du nombre est 0 si le nombre est positif et 1 si le nombre est négatif. En outre, la plupart des entiers de 32 bits. (c >> 31)
décale le numéro 31 bits, laissant le bit le plus élevé du nombre dans le spot pour le bit de poids faible. La prochaine étape de la prise de ce nombre et de la ANDing avec 1 (dont la représentation binaire est 0 partout, sauf le dernier bit) efface tous les bits supérieurs et vous donne juste le bit de poids faible. Depuis le bit de poids faible de c >> 31
est le bit le plus élevé de l' c
, ce lit le bit le plus élevé de l' c
soit 0 ou 1. Depuis le bit le plus élevé est de 1 iff c
est de 1, c'est un moyen de vérifier si c
est négatif (1) ou positive (0). La combinaison de ce raisonnement ci-dessus, k
est de 1 cas a < b
et 0 sinon.
La dernière étape est de faire ceci:
int max = a - k * c;
Si a < b
, alors k == 1
et k * c = c = a - b
, et ainsi de
a - k * c = a - (a - b) = a - a + b = b
Qui est le bon max, depuis a < b
. Si, au contraire, a >= b
, alors k == 0
et
a - k * c = a - 0 = a
Ce qui est également le bon max.