¿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?


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

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.


34

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


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


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.


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.


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

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).




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).



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).


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 ().


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.


0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.