O que o operador ^ faz em Java?

294

Que função o ^operador (circunflexo) serve em Java?

Quando eu tento isso:

int a = 5^n;

... isso me dá:

para n = 5, retorna 0
para n = 4, retorna 1
para n = 6, retorna 3

... então acho que não realiza exponenciação. Mas o que é então?

joroj
fonte
5
Você pode postar o código real que está usando?
Anthony Forloney
Estou usando o eclipse e isso retorna 11. public class SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}
2
Em Java, o ^operador não se destina ao conjunto de potência. Você precisaria em seu Math.powlugar. Veja a resposta do poligenelubricant.
Anthony Forloney
@WizardOfOdds: concordou, esta é uma boa pergunta ( ^por exponenciação? Isso é apenas senso comum!). A exploração da linguagem Java pelo OP precisa de incentivo.
polygenelubricants

Respostas:

419

O operador ^ em Java

^ em Java é o operador exclusivo-ou ("xor").

Vamos dar 5^6como exemplo:

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

Esta é a tabela verdade para bit a bit ( JLS 15.22.1 ) e lógica ( JLS 15.22.2 ) xor:

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

Mais simplesmente, você também pode pensar em xor como "isto ou aquilo, mas não ambos !".

Veja também


Exponenciação em Java

Quanto à exponenciação de número inteiro, infelizmente o Java não possui esse operador. Você pode usar double Math.pow(double, double)(converter o resultado para, intse necessário).

Você também pode usar o truque tradicional de troca de bits para calcular alguns poderes de dois. Ou seja, (1L << k)são duas à k- ésima potência para k=0..63.

Veja também


Nota merge : esta resposta foi incorporada a partir de uma outra questão, onde a intenção era usar exponenciação para converter uma cadeia"8675309"paraintsem usarInteger.parseIntcomo um exercício de programação (^denota exponenciação de agora em diante). A intenção do OP era computar8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; a próxima parte desta resposta aborda que a exponenciação não é necessária para esta tarefa.

Esquema de Horner

Atendendo a sua necessidade específica , você realmente não precisa calcular vários poderes de 10. Você pode usar o que é chamado de esquema de Horner , que não é apenas simples, mas também eficiente.

Como você está fazendo isso como um exercício pessoal, não darei o código Java, mas aqui está a idéia principal:

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

Pode parecer complicado no começo, mas realmente não é. Você basicamente lê os dígitos da esquerda para a direita e multiplica seu resultado até agora por 10 antes de adicionar o próximo dígito.

Em forma de tabela:

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
poligenelubricants
fonte
16
apenas para acrescentar a esta resposta, a função do OP está procurando é provavelmente Math.pow (10, 1)
tjohns20
146

Como muitas pessoas já apontaram, é o operador XOR . Muitas pessoas também já apontaram que, se você deseja exponenciação, precisa usar o Math.pow .

Mas acho que também é útil observar que ^é apenas uma de uma família de operadores conhecidos coletivamente como operadores 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.

A partir daqui .

Esses operadores podem ser úteis quando você precisar ler e gravar números inteiros, onde os bits individuais devem ser interpretados como sinalizadores, ou quando um intervalo específico de bits em um número inteiro tiver um significado especial e você desejar extrair apenas esses. Você pode fazer muitas programações diárias sem precisar usar esses operadores, mas se precisar trabalhar com dados no nível de bits, um bom conhecimento desses operadores é inestimável.

Mark Byers
fonte
34

É um XOR bit a bit, o Java não tem um operador de exponenciação, você precisaria usar Math.pow().

Dan Dyer
fonte
20

Regra do operador XOR =>

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

Representação binária de 4, 5 e 6:

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

agora, execute a operação XOR em 5 e 4:

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

Similarmente,

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
fonte
17

É o XORoperador bit a bit.

AraK
fonte
15

Muitas pessoas já explicaram sobre o que é e como pode ser usado, mas, além do óbvio, você pode usar esse operador para fazer muitos truques de programação, como

  • O XOR de todos os elementos em uma matriz booleana informaria se a matriz possui um número ímpar de elementos verdadeiros
  • Se você tiver uma matriz com todos os números repetindo o número par de vezes, exceto uma que repita um número ímpar de vezes, poderá encontrar isso XORing todos os elementos.
  • Trocando valores sem usar variável temporária
  • Localizando o número ausente no intervalo de 1 a n
  • Validação básica de dados enviados pela rede.

Muitos truques desse tipo podem ser feitos usando operadores pouco inteligentes, tópico interessante a ser explorado.

willsteel
fonte
14

Como outros já disseram, é um XOR bit a bit. Se você deseja aumentar um número para uma determinada potência, use Math.pow(a , b), onde aé um número e bé a potência.

Jon Skeet
fonte
13

Regra do operador XOR

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

O operador bit a bit trabalha em bits e executa operação bit a bit. Suponha que a = 60 eb = 13; agora em formato binário, eles serão os seguintes -

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
fonte
8

O link do AraK aponta para a definição de exclusive-or, que explica como essa função funciona para dois valores booleanos.

A informação que falta é como isso se aplica a dois números inteiros (ou valores do tipo inteiro). Bitwise exclusivo - ou é aplicado a pares de dígitos binários correspondentes em dois números e os resultados são remontados em um resultado inteiro.

Para usar seu exemplo:

  • A representação binária de 5 é 0101.
  • A representação binária de 4 é 0100.

Uma maneira simples de definir o XOR bit a bit é dizer que o resultado tem 1 em todos os lugares onde os dois números de entrada diferem.

Com 4 e 5, a única diferença está em último lugar; tão

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

Carl Smotricz
fonte
7

É o operador Bitwise xor em java que resulta em 1 para um valor diferente de bit (ou seja, 1 ^ 0 = 1) e 0 para o mesmo valor de bit (ou seja, 0 ^ 0 = 0) quando um número é escrito em forma binária.

ex: -

Para usar seu exemplo:

A representação binária de 5 é 0101. A representação binária de 4 é 0100.

Uma maneira simples de definir o Bitwise XOR é dizer que o resultado tem 1 em todos os lugares onde os dois números de entrada diferem.

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

Nikhil Kumar
fonte
6

Isso é porque você está usando o operador xor.

Em java, ou em qualquer outro idioma, ^ é bit a bit xor, então é claro,

10 ^ 1 = 11. mais informações sobre operadores bit a bit

É interessante como Java e C # não têm um operador de energia.

jcao219
fonte
2

É o operador bit a bit xor em java que resulta em 1 para um valor diferente (ou seja, 1 ^ 0 = 1) e 0 no mesmo valor (ou seja, 0 ^ 0 = 0).

GuruKulki
fonte
2

^ é binário (como na base-2) xor, não exponenciação (que não está disponível como um operador Java). Para exponenciação, consulte java.lang.Math.pow ().

Ming-Tang
fonte
2

É operador XOR. É usado para fazer operações de bits em números. Ele tem o comportamento tal que, quando você faz uma operação xor nos mesmos bits, diz 0 XOR 0/1 XOR 1, o resultado é 0. Mas se algum dos bits for diferente, o resultado será 1. Então, quando você fez 5 ^ 3, então você pode olhar para esses números 5, 6 em suas formas binárias e, assim, a expressão se torna (101) XOR (110), que fornece o resultado (011) cuja representação decimal é 3.

Yug Singh
fonte
0

Em outras linguagens como Python, você pode fazer 10 ** 2 = 100, experimente.

Htechno
fonte