Vraag Wat doet de operator ^ in Java?


Welke functie heeft de ^ (caret) operator dient in Java?

Wanneer ik dit probeer:

int a = 5^n;

...het geeft mij:

voor n = 5, geeft 0 terug
  voor n = 4, geeft 1 terug
  voor n = 6, levert 3 op

... dus ik veronderstel dat het geen exponentiation uitvoert. Maar wat is het dan?


227
2018-01-02 11:44


oorsprong


antwoorden:


De operator ^ in Java

^ in Java is de exclusieve-of ("xor") operator.

Laten we nemen 5^6 als voorbeeld:

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

Dit is de waarheidstabel voor bitsgewijs (JLS 15.22.1) en logisch (JLS 15.22.2) xor:

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

Eenvoudiger gezegd, u kunt ook xor als "dit" zien of dat, maar niet beide!".

Zie ook


Exponentiation in Java

Wat betreft integer exponentiatie, heeft Java helaas niet zo'n operator. Je kunt gebruiken double Math.pow(double, double) (het resultaat casten naar int indien nodig).

Je kunt ook de traditionele bit-shifting-truc gebruiken om enkele machten van twee te berekenen. Dat is, (1L << k) is twee voor de k-de macht voor k=0..63.

Zie ook


Notitie samenvoegen: dit antwoord is samengevoegd uit een andere vraag waarbij het de bedoeling was om exponentiation te gebruiken om een ​​string te converteren "8675309" naar int zonder te gebruiken Integer.parseInt als een programmeeroefening (^ staat voor exponentiation vanaf nu). De bedoeling van het OP was om te berekenen 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; het volgende deel van dit antwoord gaat over het feit dat exponentiatie niet nodig is voor deze taak.

Het schema van Horner

Adressering van uw specifiek nodig, je hoeft eigenlijk niet de verschillende machten van 10 te berekenen. Je kunt het zogenaamde de gebruiken Het schema van Horner, wat niet alleen eenvoudig maar ook efficiënt is.

Aangezien je dit doet als een persoonlijke oefening, zal ik de Java-code niet geven, maar hier is het hoofdidee:

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

Het ziet er misschien eerst ingewikkeld uit, maar dat is het echt niet. Je leest eigenlijk de cijfers van links naar rechts en je vermenigvuldigt je resultaat tot nu toe met 10 voordat je het volgende cijfer toevoegt.

In tabelvorm:

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

363
2018-04-20 02:46



Zoals veel mensen al hebben opgemerkt, is het de XOR operator. Veel mensen hebben er ook al op gewezen dat als je exponentiation wilt, dan moet je gebruiken Math.pow.

Maar ik denk dat het ook nuttig is om dat op te merken ^ is slechts een van een familie van operatoren die gezamenlijk bekend staat als bitgewijze operatoren:

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.

Van hier.

Deze operatoren kunnen van pas komen wanneer u gehele getallen moet lezen en schrijven, waarbij de afzonderlijke bits moeten worden geïnterpreteerd als vlaggen of wanneer een specifiek bereik van bits in een geheel getal een speciale betekenis heeft en u alleen die wilt extraheren. Je kunt dagelijks veel programmeren zonder deze operators ooit te hoeven gebruiken, maar als je ooit op bitniveau met gegevens moet werken, is een goede kennis van deze operators van onschatbare waarde.


131
2018-01-02 11:59



Het is bitwise XOR, Java heeft geen exponentiation-operator, je zou het moeten gebruiken Math.pow()in plaats daarvan.


32
2018-01-02 11:45



Het is de XOR bitwise-operator.


17
2018-01-02 11:45



Zoals anderen al hebben gezegd, is het bitsgewijs XOR. Als u een getal naar een bepaald vermogen wilt verhogen, gebruikt u Math.pow(a , b), waar a is een nummer en b is de kracht.


14
2018-01-02 11:46



Veel mensen hebben al uitgelegd wat het is en hoe het kan worden gebruikt, maar afgezien van het voor de hand liggende, kunt u deze operator gebruiken om veel programmeertrucs uit te voeren zoals

  • XORing van alle elementen in een Booleaanse array zou u vertellen of de array een oneven aantal ware elementen heeft
  • Als je een array hebt met alle nummers die een aantal keren worden herhaald, behalve een die een oneven aantal keren herhaalt, kun je dat vinden door alle elementen te XORen.
  • Wisselen van waarden zonder gebruik te maken van de tijdelijke variabele
  • Ontbrekend nummer vinden in het bereik van 1 tot n
  • Basisvalidatie van gegevens die via het netwerk worden verzonden.

Veel van zulke trucs kunnen worden gedaan met behulp van bit-wise operators, interessant onderwerp om te verkennen.


11
2017-07-28 10:06



AraK's koppeling verwijst naar de definitie van exclusive-or, wat verklaart hoe deze functie werkt voor twee Booleaanse waarden.

Het ontbrekende stukje informatie is hoe dit van toepassing is op twee gehele getallen (of integer-type waarden). Bitwise exclusief - of wordt toegepast op paren van overeenkomstige binaire cijfers in twee getallen, en de resultaten worden opnieuw samengesteld tot een geheel resultaat.

Om uw voorbeeld te gebruiken:

  • De binaire weergave van 5 is 0101.
  • De binaire weergave van 4 is 0100.

Een eenvoudige manier om Bitwise XOR te definiëren is om te zeggen dat het resultaat een 1 heeft op elke plaats waar de twee invoernummers verschillen.

Met 4 en 5 is het enige verschil in de laatste plaats; zo

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


7
2018-01-02 11:51



gebruik in plaats daarvan Math.pow:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#pow%28double,%20double%29


7
2018-04-20 02:48