80 votes

Fonction mathématique Java pour convertir un int positif en négatif et un négatif en positif ?

Existe-t-il une fonction Java permettant de convertir un int positif en négatif et un int négatif en positif ?

Je suis à la recherche d'un reverse pour effectuer cette conversion :

-5  ->  5
 5  -> -5

0 votes

Int x = 5 ; x = -x ;

282voto

FailedDev Points 15104

Qu'en est-il x *= -1; ? Voulez-vous vraiment une fonction de bibliothèque pour cela ?

3 votes

@pst Non, ça n'arrivera pas. Du moins pas avec le JDK 1.6.0_11 ;D

15 votes

Pour moi, la mauvaise réponse a été acceptée. C'est une réponse valide, mais étant donné que le PO demande de changer le signe d'un int, donc il n'y a pas de souci avec le zéro négatif ou d'autres concepts, je suggérerais que x = -x est plus expressif (voir la réponse de EJP ci-dessous)...

1 votes

Addendum au commentaire précédent : voir aussi la réponse de Bohème qui explique plus en détail l'opérateur unaire.

115voto

EJP Points 113412
x = -x;

C'est probablement la question la plus triviale que j'aie jamais vue.

... et la raison pour laquelle vous avez appelé cette fonction triviale 'reverse()' est un autre mystère.

8 votes

Cela ne fonctionne pas dans le cas où x = Integer.MIN_VALUE et échouera silencieusement*. Pour être sûr, vous devriez vérifier ce cas et lever une exception, ou utiliser la fonction de bibliothèque negateExact, qui fait exactement cela.

4 votes

@rdllopes La même chose s'applique à pratiquement toutes les réponses ici.

0 votes

Notez cependant qu'il ne compilera pas si x est un short ou un byte, alors que x *= -1 volonté. J'ai été un peu surpris lorsque j'ai découvert cela et c'est ainsi que je suis tombé sur cette page :) Bien sûr, vous pouvez faire un casting, mais je générais automatiquement du code où x pouvait être byte, short, int ou long...

56voto

Bohemian Points 134107

Il suffit d'utiliser le opérateur unaire moins :

int x = 5;
...
x = -x; // Here's the mystery library function - the single character "-"

Java a deux moins opérateurs :

  • le familier arithmétique version (par exemple 0 - x ), et
  • le site opération unaire moins (utilisé ici), qui annule l'opérande (unique)

Cela compile et fonctionne comme prévu.

11voto

Shivanshu Goyal Points 614

Une autre méthode (complément à 2) :

public int reverse(int x){
    x~=x;
    x++;
    return x;
}

Il fait d'abord un complément à un (en complétant tous les bits) et ajoute ensuite 1 à x. Cette méthode fait aussi bien l'affaire.

Note : Cette méthode est écrite en Java, et sera similaire à beaucoup d'autres langages.

7 votes

En réalité, ne faites pas cela, faites simplement x = -x . Du point de vue de l'assemblage, -x est un simple neg instruction pendant que ~x y ++x nécessite un not y add l'instruction.

7voto

Salix alba Points 1503

Une telle fonction n'existe pas et il n'est pas possible de l'écrire.

Le problème est le cas limite Integer.MIN_VALUE (-2,147,483,648 = 0x80000000) ; appliquez chacune des trois méthodes ci-dessus et vous obtenez la même valeur. Cela est dû à la représentation des nombres entiers et au nombre maximum possible d'entiers Integer.MAX_VALUE (-2 147 483 647 = 0x7fffffff) qui est inférieur d'une unité à ce que devrait être -Integer.MIN_VALUE.

11 votes

Si vous souhaitez que votre code soit robuste face à ce cas de figure, Java 8 propose les fonctionnalités suivantes Math.negateExact qui lancera un ArithmeticException en essayant de nier MIN_VALUE, plutôt que de renvoyer silencieusement le mauvais résultat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X