Je cherche une formule efficace fonctionnant en Java qui calcule l'expression suivante :
(low + high) / 2
qui est utilisé pour la recherche binaire. Jusqu'à présent, j'ai utilisé "low + (high - low) / 2" et "high - (high - low) / 2". pour éviter les débordements et les sous-débordements dans certains cas, mais pas dans les deux. Je cherche maintenant un moyen efficace de le faire, pour n'importe quel entier (en supposant que les entiers vont de -MAX_INT - 1 à MAX_INT).
UPDATE : En combinant les réponses de Jander et Peter G. et en expérimentant un peu, j'ai obtenu les formules suivantes pour l'élément de valeur moyenne et ses voisins immédiats :
Point médian le plus bas (égal à floor((low + high)/2)
(par exemple, [2 3] -> 2, [2 4] -> 3, [-3 -2] -> -3).
mid = (low & high) + ((low ^ high) >> 1);
Point le plus haut-moyen (égal à ceil((low + high)/2)
par exemple [2 3] -> 3, [2 4] -> 3, [-3 -2] -> -2)
low++;
mid = (low & high) + ((low ^ high) >> 1);
Avant le point médian (égal à floor((low + high - 1)/2))
(par exemple, [2 3] -> 2, [2 4] -> 2, [-7 -3] -> -6)
high--;
mid = (low & high) + ((low ^ high) >> 1);
Après le point médian (égal à ceil((low + high + 1)/2))
par exemple [2 3] -> 3, [2 4] -> 4, [-7 -3] -> -4)
mid = (low & high) + ((low ^ high) >> 1) + 1;
Ou encore, sans le signe et (&) et le signe ou (|), un code légèrement plus lent ( x >> 1
peut être remplacé par floor(x / 2)
pour obtenir des formules sans opérateur binaire) :
Point médian le plus à gauche
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1);
Point médian le plus à droite
low++
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1);
Avant le point médian
high--;
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1);
Après le point médian
halfLow = (low >> 1), halfHigh = (high >> 1);
mid = halfLow + halfHigh + ((low-2*halfLow + high-2*halfHigh) >> 1) + 1;
Note : ce qui précède >>
est considéré comme un décalage signé.