Cosa fa l'operatore ^ in Java?


295

Quale funzione svolge l' ^operatore (punto di inserimento) in Java?

Quando provo questo:

int a = 5^n;

... mi dà:

per n = 5, restituisce 0
per n = 4, restituisce 1
per n = 6, restituisce 3

... quindi immagino che non esegua l'espiazione. Ma che cos'è allora?


5
Puoi pubblicare il codice attuale che stai utilizzando?
Anthony Forloney,

Sto usando eclipse e questo restituisce 11. public class SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}

2
In Java, l' ^operatore non è pensato per il power set. Avresti bisogno Math.powinvece. Vedi la risposta del poligenilubrificante.
Anthony Forloney,

@WizardOfOdds: d'accordo, questa è una buona domanda ( ^per esponenziazione? Questo è solo buon senso!). L'esplorazione di OP del linguaggio Java deve essere incoraggiata.
poligenelubrificanti

Risposte:


420

L'operatore ^ in Java

^ in Java è l'operatore esclusivo o ("xor").

Prendiamo 5^6come esempio:

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

Questa è la tabella di verità per bitwise ( JLS 15.22.1 ) e logica ( JLS 15.22.2 ) xor:

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

Più semplicemente, puoi anche pensare a xor come "questo o quello, ma non entrambi !".

Guarda anche


Esponenziazione in Java

Per quanto riguarda l'esponenziazione dei numeri interi, purtroppo Java non ha un tale operatore. È possibile utilizzare double Math.pow(double, double)(trasmettere il risultato a intse necessario).

Puoi anche usare il tradizionale trucco di spostamento dei bit per calcolare alcuni poteri di due. Cioè, (1L << k)è due per la k -esima potenza k=0..63.

Guarda anche


Merge Nota : questa risposta è stata incorporata da un'altra domanda in cui l'intenzione era di utilizzare elevamento a potenza per convertire una stringa"8675309"diintsenza utilizzareInteger.parseIntcome un esercizio di programmazione (^denota elevamento a potenza d'ora in poi). L'intenzione del PO era di calcolare8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; la parte successiva di questa risposta affronta che l'espiazione non è necessaria per questo compito.

Schema di Horner

Affrontando le tue esigenze specifiche , in realtà non è necessario calcolare vari poteri di 10. Puoi usare quello che viene chiamato lo schema di Horner , che non è solo semplice ma anche efficiente.

Dal momento che lo stai facendo come un esercizio personale, non darò il codice Java, ma ecco l'idea 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

All'inizio può sembrare complicato, ma in realtà non lo è. In pratica leggi le cifre da sinistra a destra e moltiplica il risultato finora per 10 prima di aggiungere la cifra successiva.

In forma di tabella:

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

16
solo per aggiungere a questa risposta, la funzione che l'OP sta cercando è probabilmente Math.pow (10, 1)
tjohns20

146

Come molte persone hanno già sottolineato, è l' operatore XOR . Molte persone hanno già sottolineato che se si desidera l' espiazione, è necessario utilizzare Math.pow .

Ma penso che sia anche utile notare che ^è solo uno di una famiglia di operatori che sono noti collettivamente come operatori bit a bit:

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.

Da qui .

Questi operatori possono tornare utili quando è necessario leggere e scrivere in numeri interi in cui i singoli bit devono essere interpretati come flag o quando un intervallo specifico di bit in un numero intero ha un significato speciale e si desidera estrarre solo quelli. Puoi fare molte programmazioni quotidiane senza mai dover utilizzare questi operatori, ma se devi mai lavorare con i dati a livello di bit, una buona conoscenza di questi operatori è preziosa.


34

È XOR bit a bit, Java non ha un operatore di esponenziazione, dovresti Math.pow()invece usare .


20

Regola operatore XOR =>

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

Rappresentazione binaria di 4, 5 e 6:

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

ora, esegui l'operazione XOR su 5 e 4:

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

Allo stesso modo,

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


15

Molte persone hanno già spiegato di cosa si tratta e come può essere utilizzato, ma a parte l'ovvio è possibile utilizzare questo operatore per fare molti trucchi di programmazione come

  • XORing di tutti gli elementi in una matrice booleana ti direbbe se la matrice ha un numero dispari di elementi veri
  • Se si dispone di un array con tutti i numeri che si ripetono il numero pari di volte tranne uno che ripete il numero dispari di volte, è possibile trovarlo XORing tutti gli elementi.
  • Scambio di valori senza usare la variabile temporanea
  • Trovare il numero mancante nell'intervallo da 1 a n
  • Convalida di base dei dati inviati tramite la rete.

Molti di questi trucchi possono essere fatti usando operatori un po 'saggi, argomento interessante da esplorare.


14

Come altri hanno già detto, è XOR bit per bit. Se vuoi aumentare un numero a un dato potere, usa Math.pow(a , b), dove aè un numero ed bè il potere.


13

Regola operatore XOR

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

L'operatore bit a bit lavora su bit ed esegue operazioni bit per bit. Supponiamo che a = 60 e b = 13; ora in formato binario saranno i seguenti -

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

8

Il collegamento di AraK punta alla definizione di esclusivo -o, che spiega come questa funzione funziona per due valori booleani.

L'informazione mancante è come questo si applica a due numeri interi (o valori di tipo intero). Esclusivamente bit a bit o viene applicato a coppie di cifre binarie corrispondenti in due numeri e i risultati vengono riassemblati in un risultato intero.

Per usare il tuo esempio:

  • La rappresentazione binaria di 5 è 0101.
  • La rappresentazione binaria di 4 è 0100.

Un modo semplice per definire XOR bit a bit è dire che il risultato ha un 1 in ogni posizione in cui i due numeri di input differiscono.

Con 4 e 5, l'unica differenza è nell'ultimo posto; così

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




7

È l'operatore Bitwise xor in java che risulta 1 per diverso valore del bit (ovvero 1 ^ 0 = 1) e 0 per lo stesso valore del bit (ovvero 0 ^ 0 = 0) quando un numero viene scritto in forma binaria.

es: -

Per usare il tuo esempio:

La rappresentazione binaria di 5 è 0101. La rappresentazione binaria di 4 è 0100.

Un modo semplice per definire Bitwise XOR è dire che il risultato ha un 1 in ogni posizione in cui i due numeri di input differiscono.

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



2

È l'operatore xor bit a bit in java che risulta 1 per valore diverso (ovvero 1 ^ 0 = 1) e 0 per lo stesso valore (ovvero 0 ^ 0 = 0).


2

^ è binario (come in base-2) xor, non esponenziale (che non è disponibile come operatore Java). Per esponenziazione, consultare java.lang.Math.pow ().


2

È l'operatore XOR. Viene utilizzato per eseguire operazioni di bit sui numeri. Ha un comportamento tale che quando si esegue un'operazione xor sugli stessi bit si dice 0 XOR 0/1 XOR 1 il risultato è 0. Ma se uno qualsiasi dei bit è diverso, il risultato è 1. Quindi quando si è fatto 5 ^ 3, allora si possono guardare questi numeri 5, 6 nelle loro forme binarie e quindi l'espressione diventa (101) XOR (110) che dà il risultato (011) la cui rappresentazione decimale è 3.


0

In altre lingue come Python puoi fare 10 ** 2 = 100, provalo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.