317 votes

Ce qui ne l'opérateur ^ ne en Java?

Quelle fonction remplit le "^" opérateur de servir en Java?

Quand j'ai essayer ceci:

int a = 5^n;

...il me donne:

pour n = 5, retourne 0
pour n = 4, retourne 1
pour n = 6, renvoie 3

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

437voto

polygenelubricants Points 136838

L'opérateur ^ en Java

^ en Java est le ou-exclusif (xor) de l'opérateur.

Prenons 5^6 comme par 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 de xor en tant que "ceci ou cela, mais pas les deux!".

Voir aussi


L'Exponentiation dans Java

Comme pour l'entier exponentiation, malheureusement Java ne dispose pas d'un tel opérateur. Vous pouvez utiliser double Math.pow(double, double) (casting le résultat d' int si nécessaire).

Vous pouvez également utiliser le traditionnel de décalage de bits astuce pour calculer certaines puissances de deux. C'est, (1L << k) est les deux à la k-ième puissance pour k=0..63.

Voir aussi


De fusion remarque: cette réponse a été fusionné à partir d'une autre question à laquelle il a l'intention d'utiliser une puissance de convertir une chaîne de caractères "8675309" de int sans l'aide d' Integer.parseInt de la programmation de l'exercice (^ dénote l'exponentiation à partir de maintenant). L'OP a l'intention 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 prochaine partie de cette réponse adresses que l'exponentiation est pas nécessaire pour cette tâche.

Le schéma de Horner

L'adressage de vos spécifiques de besoin, vous avez réellement n'avez pas besoin de calculer les diverses puissances de 10. Vous pouvez utiliser ce qu'on appelle le schéma de Horner, qui est non seulement simple mais aussi efficace.

Puisque vous êtes en train de faire cela comme un exercice personnel, je ne donnerai pas 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

Il peut sembler compliqué au premier abord, mais il est vraiment pas. En gros, vous avez lu 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

150voto

Mark Byers Points 318575

Comme beaucoup de gens l'ont déjà signalé, c'est le XOR de l'opérateur. Beaucoup de gens ont déjà souligné que, si vous voulez élévation à la puissance, alors vous devez utiliser les Mathématiques.pow.

Mais je pense qu'il est aussi utile de noter que l' ^ est juste un d'une famille d'opérateurs qui sont collectivement connus comme les opérateurs sur les bits:

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 d' ici.

Ces opérateurs peuvent venir dans maniable quand vous en avez besoin pour lire et écrire des nombres entiers où les bits individuels doivent être interprétés comme des drapeaux, ou lorsqu'un nombre donné de bits en un nombre entier ont une signification particulière et que vous voulez extraire uniquement les. Vous pouvez faire beaucoup de choses de tous les jours de programmation, sans jamais avoir besoin d'utiliser ces opérateurs, mais si jamais vous avez à travailler avec des données au niveau du bit, une bonne connaissance de ces opérateurs est d'une valeur inestimable.

35voto

Dan Dyer Points 30082

C'est XOR au niveau du bit, Java ne dispose pas d'un opérateur exponentiel, vous devez utiliser Math.pow() à la place.

18voto

AraK Points 38702

C'est l' XOR opérateur au niveau du bit.

14voto

Jon Skeet Points 692016

Comme d'autres l'ont dit, c'est XOR au niveau du bit. Si vous voulez élever un nombre à une puissance donnée, utilisez Math.pow(a , b)a est un nombre et b est le pouvoir.

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