Was macht der Operator ^ in Java?

294

Welche Funktion hat der ^(Caret-) Operator in Java?

Wenn ich das versuche:

int a = 5^n;

...es gibt mir:

für n = 5 gibt 0
für n = 4 zurück, gibt 1
für n = 6 zurück, gibt 3 zurück

... also denke ich, dass es keine Potenzierung durchführt. Aber was ist es dann?

joroj
quelle
5
Können Sie den tatsächlich verwendeten Code veröffentlichen?
Anthony Forloney
Ich verwende Eclipse und dies gibt 11 zurück. Public class SimpleParser {public statisch void main (String [] args) {System.out.println ((10 ^ 1)); }}
2
In Java ist der ^Operator nicht für das Power-Set gedacht. Sie würden Math.powstattdessen brauchen . Siehe die Antwort des Polygenschmierstoffs.
Anthony Forloney
@WizardOfOdds: Einverstanden, das ist eine gute Frage ( ^zur Potenzierung? Das ist nur gesunder Menschenverstand!). Die Erforschung der Java-Sprache durch OP muss gefördert werden.
Polygenschmierstoffe

Antworten:

419

Der Operator ^ in Java

^ in Java ist der Exklusiv-Oder-Operator ("xor").

Nehmen wir 5^6als Beispiel:

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

Dies ist die Wahrheitstabelle für bitweise ( JLS 15.22.1 ) und logische ( JLS 15.22.2 ) xor:

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

Einfacher kann man sich xor auch als "dies oder das, aber nicht beides !" Vorstellen .

Siehe auch


Potenzierung in Java

Was die ganzzahlige Potenzierung betrifft, hat Java leider keinen solchen Operator. Sie können verwenden double Math.pow(double, double)(Casting des Ergebnisses aufint bei Bedarf auf).

Sie können auch den traditionellen Bitverschiebungstrick verwenden, um einige Zweierpotenzen zu berechnen. Das heißt, (1L << k)ist zwei zur k- ten Potenz für k=0..63.

Siehe auch


Hinweis zum Zusammenführen : Diese Antwort wurde aus einer anderen Frage zusammengeführt, bei der die Exponentiation zum Konvertieren eines Strings"8675309"in verwendet werden sollteint ohne sie Integer.parseIntals Programmierübung zu verwenden ( ^bezeichnet Exponentiation von nun an). Die Absicht des OP war es zu berechnen 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; Der nächste Teil dieser Antwort befasst sich damit, dass für diese Aufgabe keine Potenzierung erforderlich ist.

Horners Schema

Um Ihren spezifischen Anforderungen gerecht zu werden, müssen Sie tatsächlich keine verschiedenen Potenzen von 10 berechnen. Sie können das sogenannte Horner-Schema verwenden , das nicht nur einfach, sondern auch effizient ist.

Da Sie dies als persönliche Übung durchführen, werde ich den Java-Code nicht angeben, aber hier ist die Hauptidee:

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

Es mag zunächst kompliziert aussehen, ist es aber wirklich nicht. Grundsätzlich lesen Sie die Ziffern von links nach rechts und multiplizieren Ihr bisheriges Ergebnis mit 10, bevor Sie die nächste Ziffer hinzufügen.

In Tabellenform:

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
Polygenschmierstoffe
quelle
16
Nur um diese Antwort zu ergänzen, ist die Funktion, nach der das OP sucht, wahrscheinlich Math.pow (10, 1)
tjohns20
146

Wie viele Leute bereits betont haben, ist es der XOR- Operator. Viele Leute haben auch bereits darauf hingewiesen, dass Sie Math.pow verwenden müssen , wenn Sie eine Potenzierung wünschen .

Aber ich denke, es ist auch nützlich zu bemerken, dass dies ^nur einer aus einer Familie von Operatoren ist, die zusammen als bitweise Operatoren bezeichnet werden:

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.

Von hier aus .

Diese Operatoren können nützlich sein, wenn Sie Ganzzahlen lesen und schreiben müssen, bei denen die einzelnen Bits als Flags interpretiert werden sollen, oder wenn ein bestimmter Bitbereich in einer Ganzzahl eine besondere Bedeutung hat und Sie nur diese extrahieren möchten. Sie können jeden Tag viel programmieren, ohne diese Operatoren jemals verwenden zu müssen. Wenn Sie jedoch jemals mit Daten auf Bitebene arbeiten müssen, ist eine gute Kenntnis dieser Operatoren von unschätzbarem Wert.

Mark Byers
quelle
34

Es ist bitweises XOR, Java hat keinen Exponentiationsoperator, den Sie Math.pow()stattdessen verwenden müssten .

Dan Dyer
quelle
20

XOR-Operatorregel =>

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

Binäre Darstellung von 4, 5 und 6:

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

Führen Sie nun die XOR-Operation für 5 und 4 aus:

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

Ähnlich,

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
Sachin Ambalkar
quelle
17

Es ist der XORbitweise Operator.

AraK
quelle
15

Viele Leute haben bereits erklärt, was es ist und wie es verwendet werden kann, aber abgesehen von dem Offensichtlichen können Sie diesen Operator verwenden, um viele Programmier-Tricks wie z

  • Durch XOR-Verknüpfung aller Elemente in einem booleschen Array wird angezeigt, ob das Array eine ungerade Anzahl wahrer Elemente enthält
  • Wenn Sie ein Array haben, in dem sich alle Zahlen gerade wiederholen, außer einem, das sich ungerade wiederholt, können Sie dies durch XOR-Verknüpfung aller Elemente feststellen.
  • Werte tauschen ohne temporäre Variable
  • Fehlende Nummer im Bereich von 1 bis n finden
  • Grundlegende Validierung von Daten, die über das Netzwerk gesendet werden.

Viele solcher Tricks können mit bitweisen Operatoren ausgeführt werden, ein interessantes Thema, das es zu erkunden gilt.

willsteel
quelle
14

Wie andere gesagt haben, ist es bitweises XOR. Wenn Sie eine Zahl auf eine bestimmte Potenz erhöhen möchten, verwenden Sie Math.pow(a , b), wobei aeine Zahl und bdie Potenz ist.

Jon Skeet
quelle
13

XOR-Operatorregel

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

Der bitweise Operator arbeitet mit Bits und führt eine bitweise Operation durch. Angenommen, a = 60 und b = 13; jetzt im Binärformat werden sie wie folgt sein -

a = 0011 1100

b = 0000 1101



a^b ==> 0011 1100  (a)
        0000 1101  (b)
        -------------  XOR
        0011 0001  => 49

(a ^ b) will give 49 which is 0011 0001
Mayur Dabhi
quelle
8

Der Link von AraK verweist auf die Definition von exklusiv-oder, die erklärt, wie diese Funktion für zwei boolesche Werte funktioniert.

Die fehlende Information ist, wie dies für zwei Ganzzahlen (oder ganzzahlige Werte) gilt. Bitweises Exklusiv-oder wird auf Paare entsprechender Binärziffern in zwei Zahlen angewendet, und die Ergebnisse werden zu einem ganzzahligen Ergebnis zusammengesetzt.

So verwenden Sie Ihr Beispiel:

  • Die binäre Darstellung von 5 ist 0101.
  • Die binäre Darstellung von 4 ist 0100.

Eine einfache Möglichkeit, bitweises XOR zu definieren, besteht darin, zu sagen, dass das Ergebnis an jeder Stelle, an der sich die beiden Eingangsnummern unterscheiden, eine 1 hat.

Bei 4 und 5 ist der einzige Unterschied der letzte; damit

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

Carl Smotricz
quelle
7

Es ist der bitweise xor-Operator in Java, der 1 für einen anderen Bitwert (dh 1 ^ 0 = 1) und 0 für denselben Bitwert (dh 0 ^ 0 = 0) ergibt, wenn eine Zahl in binärer Form geschrieben wird.

Ex :-

So verwenden Sie Ihr Beispiel:

Die binäre Darstellung von 5 ist 0101. Die binäre Darstellung von 4 ist 0100.

Eine einfache Möglichkeit, Bitwise XOR zu definieren, besteht darin, zu sagen, dass das Ergebnis an jeder Stelle, an der sich die beiden Eingangsnummern unterscheiden, eine 1 hat.

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

Nikhil Kumar
quelle
6

Dies liegt daran, dass Sie den Operator xor verwenden.

In Java oder in fast jeder anderen Sprache ist ^ bitweise xor, also natürlich

10 ^ 1 = 11. Weitere Informationen zu bitweisen Operatoren

Es ist interessant, dass Java und C # keinen Energieversorger haben.

jcao219
quelle
2

Es ist der bitweise xor-Operator in Java, der 1 für einen anderen Wert (dh 1 ^ 0 = 1) und 0 für denselben Wert (dh 0 ^ 0 = 0) ergibt.

GuruKulki
quelle
2

^ ist binär (wie in Base-2) xor, nicht exponentiation (was als Java-Operator nicht verfügbar ist). Informationen zur Potenzierung finden Sie unter java.lang.Math.pow ().

Ming-Tang
quelle
2

Es ist ein XOR-Operator. Es wird verwendet, um Bitoperationen an Zahlen durchzuführen. Es hat das Verhalten, dass, wenn Sie eine xor-Operation mit denselben Bits ausführen, z. B. 0 XOR 0/1 XOR 1, das Ergebnis 0 ist. Wenn jedoch eines der Bits unterschiedlich ist, ist das Ergebnis 1. Wenn Sie also 5 ^ 3 ausgeführt haben, dann Sie kann diese Zahlen 5, 6 in ihren binären Formen betrachten und somit wird der Ausdruck (101) XOR (110), was das Ergebnis (011) ergibt, dessen Dezimaldarstellung 3 ist.

Yug Singh
quelle
0

In anderen Sprachen wie Python können Sie 10 ** 2 = 100 ausprobieren.

Htechno
quelle