¿Qué hace el operador ^ en Java?

¿Qué función cumple el operador ^ (cursivo) en Java?

Cuando bash 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?

El operador ^ en Java

^ en Java es el operador exclusivo-o (“xor”).

Tomemos 5^6 como ejemplo:

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

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

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

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

Ver también

  • Wikipedia: exclusivo o

Exponenciación en Java

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

También puede usar el truco de cambio de bit tradicional para calcular algunos poderes de dos. Es decir, (1L < < k) es dos a la potencia k -ésima para k=0..63 .

Ver también

  • Wikipedia: Cambio aritmético

Nota de fusión : esta respuesta se fusionó de otra pregunta donde la intención era usar exponenciación para convertir una cadena "8675309" a int sin usar Integer.parseInt como un ejercicio de progtwigción ( ^ denota exponenciación a partir de ahora). La intención del OP era calcular 8*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

Al 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 lo está haciendo como ejercicio personal, no le daré el código de 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, lees los dígitos de izquierda a derecha y multiplicas tu 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 

Como muchas personas ya han señalado, es el operador XOR . Muchas personas ya han señalado que si quieres la exponenciación, entonces necesitas usar Math.pow .

Pero creo que también es útil tener en cuenta que ^ es solo una 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 aquí .

Estos operadores pueden ser útiles cuando necesite leer y escribir en enteros donde los bits individuales deben interpretarse como indicadores, o cuando un rango específico de bits en un entero tiene un significado especial y desea extraer solo esos. Puede hacer una gran cantidad de progtwigción diaria sin tener que utilizar estos operadores, pero si alguna vez tiene que trabajar con datos en el nivel de bits, un buen conocimiento de estos operadores es muy valioso.

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

Es el operador de bit a bit de XOR .

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

Muchas personas ya han explicado sobre qué es y cómo se puede usar, pero aparte de lo obvio, puedes usar este operador para hacer muchos trucos de progtwigció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 repitiendo un número par de veces, excepto uno que repite una cantidad impar de veces, puede encontrarlo haciendo una XOR de todos los elementos.
  • Intercambio de valores sin usar variable temporal
  • Encontrar el número que falta 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.

Es el operador Bitwise xor en java que da como resultado 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 un número se escribe en forma binaria.

ex: –

Para usar tu 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 los dos números de entrada difieren.

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

Como ya se indicó en la (s) otra (s) respuesta (s), es el operador “exclusivo o” (XOR) . Para obtener más información sobre los operadores de bits en Java, consulte: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html

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

La información que falta es cómo esto se aplica a dos enteros (o valores de tipo entero). La exclusividad de bit o 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 tu ejemplo:

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

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

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

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

Eso es porque estás usando el operador xor.

En java, o casi cualquier otro idioma, ^ es bit a bit xor, 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.

Regla de 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 

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

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

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

Es el operador XOR. Se usa para hacer operaciones de bits en números. Tiene el comportamiento tal que cuando haces una operación xor en los mismos bits, digamos 0 XOR 0/1 XOR 1, el resultado es 0. Pero si alguno de los bits es diferente, el resultado es 1. Entonces, cuando hiciste 5 ^ 3, entonces puede ver estos números 5, 6 en sus formas binarias y así la expresión se convierte en (101) XOR (110) que da el resultado (011) cuya representación decimal es 3.