¿Qué hace el operador ^ en Java?

295

¿Qué función desempeña el ^ operador (caret) en Java?

Cuando intento esto:

int a = 5^n;

...me da:

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

... así que supongo que no realiza exponenciación. ¿Pero qué es entonces?

joroj
fuente
55
¿Puedes publicar el código real que estás usando?
Anthony Forloney el
Estoy usando eclipse y esto devuelve 11. public class SimpleParser {public static void main (String [] args) {System.out.println ((10 ^ 1)); }}
2
En Java, el ^operador no está destinado a la configuración de potencia. Necesitarías en su Math.powlugar. Ver la respuesta del poligenel lubricante.
Anthony Forloney el
@WizardOfOdds: de acuerdo, esta es una buena pregunta (¿ ^para exponenciación? ¡Eso es solo sentido común!). La exploración de OP del lenguaje Java necesita ser alentadora.
Polygenelubricants

Respuestas:

420

El operador ^ en Java

^ en Java es el operador exclusivo o ("xor").

Tomemos 5^6como ejemplo:

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

Esta es la tabla de verdad para bitwise ( JLS 15.22.1 ) y lógica ( JLS 15.22.2 ) xor:

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

Más simplemente, también puedes pensar en xor como "esto o aquello, pero no ambos !".

Ver también


Exponenciación en Java

En cuanto a la exponenciación de enteros, desafortunadamente Java no tiene dicho operador. Puedes usar double Math.pow(double, double)(enviar el resultado aint si es necesario).

También puede usar el tradicional truco de desplazamiento de bits para calcular algunas potencias de dos. Es decir, (1L << k)son dos para la k -ésima potencia para k=0..63.

Ver también


Combinar nota : esta respuesta se fusionó a otra pregunta donde la intención era utilizar exponenciación para convertir una cadena"8675309"aintsin necesidad de utilizarInteger.parseIntcomo un ejercicio de programación (^denota exponenciación de ahora en adelante). La intención del OP era calcular8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0 = 8675309; La siguiente parte de esta respuesta aborda que la exponenciación no es necesaria para esta tarea.

Esquema de Horner

Para abordar su necesidad específica , en realidad no necesita calcular varios poderes de 10. Puede usar lo que se llama el esquema de Horner , que no solo es simple sino también eficiente.

Como estás haciendo esto como un ejercicio personal, no daré el código Java, pero esta es la idea 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

Puede parecer complicado al principio, pero realmente no lo es. Básicamente, lee los dígitos de izquierda a derecha y multiplica su resultado hasta ahora por 10 antes de agregar el siguiente dígito.

En forma de tabla:

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
poligenelubricantes
fuente
16
solo para agregar a esta respuesta, la función que busca el OP es probablemente Math.pow (10, 1)
tjohns20
146

Como muchas personas ya han señalado, es el operador XOR . Muchas personas también han señalado que si desea exponenciación, entonces necesita usar Math.pow .

Pero creo que también es útil tener en cuenta que ^es solo uno de una familia de operadores que se conocen colectivamente 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.

Desde aqui .

Estos operadores pueden ser útiles cuando necesita leer y escribir en números enteros donde los bits individuales deben interpretarse como banderas, o cuando un rango específico de bits en un número entero tiene un significado especial y desea extraer solo esos. Puede hacer gran parte de la programación diaria sin necesidad de usar estos operadores, pero si alguna vez tiene que trabajar con datos a nivel de bits, un buen conocimiento de estos operadores es invaluable.

Mark Byers
fuente
34

Es XOR a nivel de bit, Java no tiene un operador de exponenciación, debería usarlo Math.pow()en su lugar.

Dan Dyer
fuente
20

Regla del operador XOR =>

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

Representación binaria de 4, 5 y 6:

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

ahora, realice la operación XOR en 5 y 4:

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

Similar,

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

Es el XORoperador bit a bit.

AraK
fuente
15

Muchas personas ya han explicado qué es y cómo se puede usar, pero aparte de lo obvio, puedes usar este operador para hacer muchos trucos de programación como

  • XORing de todos los elementos en una matriz booleana le diría si la matriz tiene un número impar de elementos verdaderos
  • Si tiene una matriz con todos los números que se repiten un número par de veces, excepto uno que repite un número impar de veces, puede encontrarlo haciendo XOR a todos los elementos.
  • Intercambiar valores sin usar variables temporales
  • Encontrar el número faltante en el rango de 1 a n
  • Validación básica de los datos enviados a través de la red.

Muchos de estos trucos se pueden hacer utilizando operadores poco sabios, un tema interesante para explorar.

Willsteel
fuente
14

Como otros han dicho, es XOR bit a bit. Si desea elevar un número a una potencia dada, use Math.pow(a , b), donde aes un número y bes la potencia.

Jon Skeet
fuente
13

Regla del operador XOR

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

El operador bit a bit trabaja en bits y realiza la operación bit a bit. Suponga que a = 60 yb = 13; ahora en formato binario serán los siguientes:

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

El enlace de AraK apunta a la definición de exclusive-or, que explica cómo funciona esta función para dos valores booleanos.

La información que falta es cómo se aplica esto a dos enteros (o valores de tipo entero). Bitwise exclusive-or se aplica a pares de dígitos binarios correspondientes en dos números, y los resultados se vuelven a ensamblar en un resultado entero.

Para usar su ejemplo:

  • La representación binaria de 5 es 0101.
  • La representación binaria de 4 es 0100.

Una manera simple de definir XOR a nivel de bits es decir que el resultado tiene un 1 en cada lugar donde difieren los dos números de entrada.

Con 4 y 5, la única diferencia está en el último lugar; entonces

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

Carl Smotricz
fuente
7

Es el operador xor de Bitwise en java que resulta 1 para diferentes valores de bit (es decir, 1 ^ 0 = 1) y 0 para el mismo valor de bit (es decir, 0 ^ 0 = 0) cuando se escribe un número en forma binaria.

ex: -

Para usar su ejemplo:

La representación binaria de 5 es 0101. La representación binaria de 4 es 0100.

Una manera simple de definir Bitwise XOR es decir que el resultado tiene un 1 en cada lugar donde difieren los dos números de entrada.

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

Nikhil Kumar
fuente
6

Eso es porque está utilizando el operador xor.

En java, o en cualquier otro idioma, ^ es bit a bit o, por supuesto,

10 ^ 1 = 11. más información sobre operadores bit a bit

Es interesante cómo Java y C # no tienen un operador de energía.

jcao219
fuente
2

Es el operador xor bit a bit en java que da como resultado 1 para un valor diferente (es decir, 1 ^ 0 = 1) y 0 para el mismo valor (es decir, 0 ^ 0 = 0).

GuruKulki
fuente
2

^ es binario (como en base-2) xor, no exponenciación (que no está disponible como operador Java). Para la exponenciación, vea java.lang.Math.pow ().

Ming-Tang
fuente
2

Es operador XOR. Se utiliza para realizar operaciones de bits en números. Tiene el comportamiento tal que cuando realiza una operación xor en los mismos bits, diga 0 XOR 0/1 XOR 1, el resultado es 0. Pero si alguno de los bits es diferente, entonces el resultado es 1. Entonces, cuando hizo 5 ^ 3, entonces puede mirar estos números 5, 6 en sus formas binarias y, por lo tanto, la expresión se convierte en (101) XOR (110) que da el resultado (011) cuya representación decimal es 3.

Yug Singh
fuente
0

En otros lenguajes como Python puedes hacer 10 ** 2 = 100, pruébalo.

Htechno
fuente