Que fait l'opérateur ^ en Java?

quelle fonction L'opérateur ^ (caret) sert-il en Java?

Quand j'ai essayer ceci:

int a = 5^n;

... il me donne:

pour n= 5, renvoie 0

pour n = 4, renvoie 1

pour n = 6, renvoie 3

... donc je suppose qu'il n'effectue pas d'exponentiation. Mais qu'en est-il alors?

232
demandé sur Nayuki 2010-01-02 14:44:47

16 réponses

l'opérateur ^ en Java

^ en Java est l'opérateur exclusif ("xor").

prenons 5^6 comme exemple:

(decimal)    (binary)
     5     =  101
     6     =  110
------------------ xor
     3     =  011

Ce la table de vérité pour bit-à-bit ( JLS 15.22.1 ) et logique ( JLS 15.22.2 ) xor:

^ | 0 1      ^ | F T
--+-----     --+-----
0 | 0 1      F | F T
1 | 1 0      T | T F

plus simplement, vous pouvez aussi penser à xor comme "ce ou ça, mais pas les deux !".

Voir aussi


l'Exponentiation dans Java

comme pour l'exponentiation entière, malheureusement Java ne dispose pas d'un tel opérateur. Vous pouvez utiliser double Math.pow(double, double) (si nécessaire).

vous pouvez également utiliser le tour traditionnel de bit-shifting pour calculer quelques pouvoirs de deux. C'est-à-dire, (1L << k) est deux à la k - E puissance pour k=0..63 .

Voir aussi


note de fusion : cette réponse a été fusionnée à partir d'une autre question Où l'intention était d'utiliser l'exponentiation pour convertir une chaîne de caractères "8675309" en int sans utiliser Integer.parseInt comme exercice de programmation ( ^ dénote une exponentiation à partir de maintenant). L'intention de L'OP était de calculer 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309 ; la partie suivante de cette réponse aborde que l'exponentiation n'est pas nécessaire pour cette tâche.

de claude bernard-Horner régime

S'adressant à votre spécifique besoin, vous n'avez pas besoin de calculer divers pouvoirs de 10. Vous pouvez utiliser ce qui est appelé le horner's scheme , qui est non seulement simple mais aussi efficace.

puisque vous faites cela comme un exercice personnel, Je ne vais pas donner le code Java, mais voici l'idée principale:

8675309 = 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0
        = (((((8*10 + 6)*10 + 7)*10 + 5)*10 + 3)*10 + 0)*10 + 9

cela peut sembler compliqué au début, mais ce n'est vraiment pas le cas. Vous lisez les chiffres de gauche à droite, et vous multipliez le résultat par 10 avant d'ajouter le chiffre suivant.

sous forme de tableau:

step   result  digit  result*10+digit
   1   init=0      8                8
   2        8      6               86
   3       86      7              867
   4      867      5             8675
   5     8675      3            86753
   6    86753      0           867530
   7   867530      9          8675309=final
372
répondu polygenelubricants 2013-03-06 01:47:13

comme beaucoup de gens l'ont déjà souligné, c'est l'opérateur XOR . Beaucoup de gens ont déjà souligné que si vous voulez l'exponentiation alors vous devez utiliser Math.pow .

mais je pense qu'il est également utile de noter que ^ est juste un d'une famille d'opérateurs qui sont collectivement connus comme opérateurs bitwise:

Operator    Name         Example     Result  Description
a & b       and          3 & 5       1       1 if both bits are 1.
a | b       or           3 | 5       7       1 if either bit is 1.
a ^ b       xor          3 ^ 5       6       1 if both bits are different.
~a          not          ~3          -4      Inverts the bits.
n << p      left shift   3 << 2      12      Shifts the bits of n left p positions. Zero bits are shifted into the low-order positions.
n >> p      right shift  5 >> 2      1       Shifts the bits of n right p positions. If n is a 2's complement signed number, the sign bit is shifted into the high-order positions.
n >>> p     right shift  -4 >>> 28   15      Shifts the bits of n right p positions. Zeros are shifted into the high-order positions.

à Partir de ici .

ces opérateurs peuvent être utiles lorsque vous avez besoin de lire et d'écrire sur des entiers où les bits individuels doivent être interprétés comme des drapeaux, ou lorsqu'une plage spécifique de bits dans un entier ont une signification particulière et que vous voulez en extraire seulement ceux. Vous pouvez faire beaucoup de programmation quotidienne sans jamais avoir besoin d'utiliser ces opérateurs, mais si vous avez à travailler avec des données au niveau bit, une bonne connaissance de ces opérateurs est inestimable.

131
répondu Mark Byers 2016-03-21 11:17:23

c'est bitwise XOR, Java n'a pas d'opérateur exponentiation, vous devriez utiliser Math.pow() à la place.

32
répondu Dan Dyer 2010-01-02 11:45:56

c'est l'opérateur XOR bitwise.

17
répondu AraK 2010-01-02 11:45:47

comme d'autres l'ont dit, C'est bitwise XOR. Si vous voulez élever un nombre à une puissance donnée, l'utilisation Math.pow(a , b) , où a est un nombre et b est le pouvoir.

14
répondu Jon Skeet 2013-12-02 23:28:29

Beaucoup de gens ont déjà expliqué sur ce qu'il est et comment il peut être utilisé, mais en dehors de l'évidente vous pouvez utiliser cet opérateur pour faire beaucoup de programmation des trucs comme

  • XORing de tous les éléments dans un booléen tableau vous dira si le tableau contient un nombre impair de vrais éléments
  • si vous avez un tableau avec tous les nombres se répétant Pair nombre de fois sauf un qui se répète Impair nombre de fois, vous pouvez trouver que par XORing tous les éléments.
  • changement de valeurs sans utiliser de variable temporaire
  • constatation d'un nombre manquant dans l'intervalle de 1 à n
  • validation de base des données envoyées sur le réseau.

beaucoup de tels trucs peuvent être faits en utilisant des opérateurs de bits sages, sujet intéressant à explorer.

12
répondu willsteel 2015-07-28 10:49:19
7
répondu Luis 2010-04-20 02:48:02

c'est l'opérateur XOR Bitwise en java qui donne 1 pour une valeur différente de bit (ie 1 ^ 0 = 1) et 0 pour la même valeur de bit (ie 0 ^ 0 = 0) lorsqu'un nombre est écrit sous forme binaire.

ex: -

pour utiliser votre exemple:

la représentation binaire de 5 est 0101. La représentation binaire de 4 0100.

une façon simple de définir Bitwise XOR est de dire que le résultat a un 1 dans chaque endroit où les deux numéros différents.

0101 ^ 0100 = 0001 (5 ^ 4 = 1) .

7
répondu Nikhil Kumar 2015-04-14 07:15:20

comme déjà indiqué par l'autre(S) réponse (s), c'est l'opérateur " exclusif ou "(XOR) . Pour plus d'informations sur les opérateurs bit en Java, voir: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

6
répondu Bart Kiers 2010-01-02 11:48:04

le lien D'AraK pointe vers la définition d'exclusive-or, qui explique comment cette fonction fonctionne pour deux valeurs booléennes.

l'information manquante est la façon dont cela s'applique à deux entiers (ou valeurs de type entier). Exclusif Bitwise-ou est appliqué à des paires de chiffres binaires correspondants en deux nombres, et les résultats sont assemblés en un résultat entier.

pour utiliser votre exemple:

  • le binaire la représentation de 5 est 0101.
  • la représentation binaire de 4 est 0100.

une façon simple de définir bitwise XOR est de dire que le résultat a un 1 dans chaque endroit où les deux nombres d'entrée diffèrent.

avec 4 et 5, la seule différence est à la dernière place; donc

0101 ^ 0100 = 0001 (5 ^ 4 = 1) .

6
répondu Carl Smotricz 2010-01-02 11:51:22

C'est parce que vous utilisez l'opérateur xor.

en java, ou à peu près n'importe quel autre langage, ^ est bitwise xor, alors bien sûr,

10 ^ 1 = 11. plus d'informations sur les opérateurs bitwise

C'est intéressant comme Java et C# n'ont pas d'opérateur.

6
répondu jcao219 2010-04-20 02:53:31

règle de l'opérateur XOR = >

0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1

représentation binaire des 4, 5 et 6:

4 = 1 0 0 
5 = 1 0 1
6 = 1 1 0

maintenant, effectuer l'opération XOR sur 5 et 4:

     5 ^ 4 => 1  0  1   (5)
              1  0  0   (4)
            ----------
              0  0  1   => 1

de même,

5 ^ 5 => 1   0   1    (5)
         1   0   1    (5)
       ------------
         0   0   0   => (0)


5 ^ 6 => 1   0   1  (5)
         1   1   0  (6)
        -----------
         0   1   1  => 3
6
répondu Sachin Ambalkar 2017-11-04 02:32:35

c'est l'opérateur XOR en java qui donne 1 pour une valeur différente (ie 1 ^ 0 = 1) et 0 pour la même valeur (ie 0 ^ 0 = 0).

2
répondu GuruKulki 2010-01-02 14:19:40

^ est binaire (comme dans la base-2) xor, pas exponentiation (qui n'est pas disponible en tant qu'opérateur Java). Pour l'exponentiation, voir java.lang.Mathématique.pow ().

2
répondu Ming-Tang 2010-04-20 02:57:02

dans D'autres langues comme Python vous pouvez faire 10**2=100, essayez-le.

1
répondu mkotechno 2010-04-20 02:56:01

c'est opérateur XOR. Il est utilisé pour effectuer quelques opérations sur les nombres. Il a le comportement tel que lorsque vous faites une opération xor sur les mêmes bits dire 0 XOR 0 / 1 XOR 1 le résultat est 0. Mais si l'un des bits est différente, alors le résultat est 1. Donc quand vous avez fait 5^3 alors vous pouvez regarder ces nombres 5, 6 dans leurs formes binaires et ainsi l'expression devient (101) XOR (110) qui donne le résultat (011) dont la représentation décimale est 3.

1
répondu Yug Singh 2017-07-21 03:46:14