Co robi operator ^ w Javie?

294

Jaką funkcję pełni ^operator (karetka) w Javie?

Kiedy spróbuję:

int a = 5^n;

...to daje mi:

dla n = 5 zwraca 0
dla n = 4, zwraca 1
dla n = 6, zwraca 3

... więc myślę, że nie wykonuje potęgowania. Ale co to jest?

joroj
źródło
5
Czy możesz opublikować rzeczywisty kod, którego używasz?
Anthony Forloney,
Korzystam z Eclipse, a to zwraca 11. public class SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}
2
W Javie ^operator nie jest przeznaczony do zestawu zasilania. Zamiast tego będziesz potrzebować Math.pow. Zobacz odpowiedź wieloskładnikowy.
Anthony Forloney,
@WizardOfOdds: zgadzam się, to dobre pytanie ( ^dla potęgowania? To po prostu zdrowy rozsądek!). Eksploracja języka Java przez OP wymaga zachęcania.
polygenelubrykanty

Odpowiedzi:

419

Operator ^ w Javie

^ w Javie jest operatorem wyłącznym lub („xor”).

Weźmy 5^6jako przykład:

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

Ta tabela prawdy dla bitowego ( JLS 15.22.1 ) i logicznego ( JLS 15.22.2 ) xor:

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

Mówiąc prościej, możesz również myśleć o xor jako „tym czy innym, ale nie obu !”.

Zobacz też


Potęgowanie w Javie

Jeśli chodzi o potęgowanie liczb całkowitych, niestety Java nie ma takiego operatora. Możesz użyć double Math.pow(double, double)(rzutując wynik na, intjeśli to konieczne).

Możesz także użyć tradycyjnej sztuczki polegającej na przesuwaniu bitów, aby obliczyć niektóre potęgi dwóch. Oznacza to, że (1L << k)wynosi dwa do k- tej potęgi dla k=0..63.

Zobacz też


Merge uwaga : ta odpowiedź została połączona z innym pytaniem gdzie intencją było wykorzystanie potęgowanie przekonwertować ciąg"8675309"abyintbez użyciaInteger.parseIntjako programowanie ćwiczeń (^oznacza potęgowanie od teraz). Zamiarem PO było obliczenie8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; kolejna część tej odpowiedzi dotyczy tego, że potęgowanie nie jest konieczne do wykonania tego zadania.

Schemat Hornera

Wychodząc naprzeciw konkretnym potrzebom, tak naprawdę nie musisz obliczać różnych mocy 10. Możesz użyć tak zwanego schematu Hornera , który jest nie tylko prosty, ale również wydajny.

Ponieważ robisz to jako ćwiczenie osobiste, nie podam kodu Java, ale oto główna idea:

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

Na początku może wydawać się skomplikowane, ale tak naprawdę nie jest. Zasadniczo czytasz cyfry od lewej do prawej i zwielokrotniasz dotychczasowy wynik przez 10 przed dodaniem kolejnej cyfry.

W formie tabeli:

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
środki smarujące wielotlenowe
źródło
16
aby dodać do tej odpowiedzi, funkcja, której szuka OP, to prawdopodobnie Math.pow (10, 1)
tjohns20
146

Jak wiele osób już zauważyło, jest to operator XOR . Wiele osób już zauważyło, że jeśli chcesz potęgować, musisz użyć Math.pow .

Ale myślę, że warto również zauważyć, że ^jest to tylko jedna z rodziny operatorów, które są wspólnie znane jako operatory bitowe:

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.

Od tutaj .

Operatory te mogą się przydać, gdy trzeba odczytywać i zapisywać liczby całkowite, w których poszczególne bity powinny być interpretowane jako flagi, lub gdy określony zakres bitów w liczbie całkowitej ma specjalne znaczenie i chcesz je wyodrębnić. Możesz robić wiele codziennego programowania bez konieczności korzystania z tych operatorów, ale jeśli kiedykolwiek będziesz musiał pracować z danymi na poziomie bitów, dobra znajomość tych operatorów jest nieoceniona.

Mark Byers
źródło
34

Jest to bitowe XOR, Java nie ma operatora potęgowania, musiałbyś Math.pow()zamiast tego użyć .

Dan Dyer
źródło
20

Reguła operatora XOR =>

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

Reprezentacja binarna 4, 5 i 6:

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

teraz wykonaj operację XOR na 5 i 4:

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

Podobnie,

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
źródło
15

Wiele osób już wyjaśniło, co to jest i jak można z niego korzystać, ale poza oczywistym faktem można użyć tego operatora do wykonania wielu sztuczek programistycznych, takich jak

  • XORing wszystkich elementów w tablicy boolowskiej powiedziałby ci, czy tablica zawiera nieparzystą liczbę prawdziwych elementów
  • Jeśli masz tablicę ze wszystkimi liczbami powtarzającymi się parzystą liczbę razy, z wyjątkiem jednej, która powtarza nieparzystą liczbę razy, możesz to znaleźć poprzez XORing wszystkich elementów.
  • Zamiana wartości bez użycia zmiennej tymczasowej
  • Znalezienie brakującej liczby w zakresie od 1 do n
  • Podstawowa weryfikacja danych przesyłanych przez sieć.

Wiele takich sztuczek można wykonać za pomocą nieco mądrych operatorów, interesujący temat do zbadania.

willsteel
źródło
14

Jak powiedzieli inni, to bitowe XOR. Jeśli chcesz podnieść liczbę do danej potęgi, użyj Math.pow(a , b), gdzie ajest liczbą i bpotęgą.

Jon Skeet
źródło
13

Reguła operatora XOR

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

Operator bitowy działa na bitach i wykonuje operacje krok po kroku. Załóżmy, że a = 60 ib = 13; teraz w formacie binarnym będą wyglądać następująco -

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
źródło
8

Łącze AraK wskazuje na definicję wyłączności-lub, która wyjaśnia, w jaki sposób ta funkcja działa dla dwóch wartości boolowskich.

Brakująca informacja dotyczy tego, w jaki sposób dotyczy to dwóch liczb całkowitych (lub wartości typu całkowitoliczbowego). Bitowe wykluczanie - lub jest stosowane do par odpowiednich cyfr binarnych w dwóch liczbach, a wyniki są ponownie składane w wynik liczby całkowitej.

Aby użyć swojego przykładu:

  • Binarna reprezentacja 5 to 0101.
  • Binarna reprezentacja 4 to 0100.

Prostym sposobem na zdefiniowanie bitowego XOR jest powiedzenie, że wynik ma 1 w każdym miejscu, w którym dwie liczby wejściowe różnią się.

W przypadku 4 i 5 jedyną różnicą jest ostatnie miejsce; więc

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

Carl Smotricz
źródło
7

Jest to bitowy operator xor w Javie, który daje 1 dla innej wartości bitu (tj. 1 ^ 0 = 1) i 0 dla tej samej wartości bitu (tj. 0 ^ 0 = 0), gdy liczba jest zapisywana w postaci binarnej.

np .:

Aby użyć swojego przykładu:

Reprezentacja binarna liczby 5 to 0101. Reprezentacja binarna liczby 4 to 0100.

Prostym sposobem na zdefiniowanie bitowej wartości XOR jest powiedzenie, że wynik ma 1 w każdym miejscu, w którym dwie liczby wejściowe różnią się.

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

Nikhil Kumar
źródło
6

Jest tak, ponieważ używasz operatora Xor.

W języku Java lub w jakimkolwiek innym języku ^ jest bitowe xor, więc oczywiście

10 ^ 1 = 11. więcej informacji o operatorach bitowych

Interesujące jest to, że Java i C # nie mają operatora mocy.

jcao219
źródło
2

Jest to bitowy operator xor w Javie, który daje 1 dla innej wartości (tj. 1 ^ 0 = 1) i 0 dla tej samej wartości (tj. 0 ^ 0 = 0).

GuruKulki
źródło
2

^ jest binarny (jak w base-2) xor, a nie potęgowanie (który nie jest dostępny jako operator Java). Aby dowiedzieć się więcej o potęgowaniu, zobacz java.lang.Math.pow ().

Ming-Tang
źródło
2

Jest to operator XOR. Służy do wykonywania operacji bitowych na liczbach. Zachowuje się tak, że gdy wykonujesz operację xor na tych samych bitach, powiedz 0 XOR 0/1 XOR 1, wynikiem jest 0. Ale jeśli któryś z bitów jest inny, to wynik wynosi 1. Więc kiedy zrobiłeś 5 ^ 3, to zrobiłeś może patrzeć na te liczby 5, 6 w postaci binarnej, a zatem wyrażenie staje się (101) XOR (110), co daje wynik (011), którego dziesiętna reprezentacja wynosi 3.

Yug Singh
źródło
0

W innych językach, takich jak Python, możesz zrobić 10 ** 2 = 100, spróbuj.

Htechno
źródło