¿Qué hace el operador ^ en Java?
¿Qué función ^
cumple 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?
El operador ^ en Java
^
en Java es el operador exclusivo-or ("xor").
Tomemos 5^6
como ejemplo:
(decimal) (binary)
5 = 101
6 = 110
------------------ xor
3 = 011
Esta es la tabla de verdad para xor bit a bit ( JLS 15.22.1 ) y lógico ( JLS 15.22.2 ):
^ | 0 1 ^ | F T
--+----- --+-----
0 | 0 1 F | F T
1 | 1 0 T | T F
De manera más simple, también puedes pensar en xor como "esto o aquello, ¡pero no ambos !".
Ver también
- Wikipedia: exclusiva-o
Exponenciación en Java
En cuanto a la exponenciación de números enteros, desafortunadamente Java no tiene dicho operador. Puede utilizar double Math.pow(double, double)
(transmitiendo el resultado int
si es necesario).
También puedes utilizar el truco tradicional de desplazamiento de bits para calcular algunas potencias de dos. Es decir, (1L << k)
es dos elevado a la k -ésima potencia para k=0..63
.
Ver también
- Wikipedia: desplazamiento aritmético
Nota de fusión : esta respuesta se fusionó de otra pregunta en la que la intención era usar la exponenciación para convertir una cadena
"8675309"
sinint
usarlaInteger.parseInt
como 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.
El esquema de Horner
Para abordar su necesidad específica , en realidad no necesita calcular varias potencias 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 en realidad no lo es. Básicamente, lees los dígitos de izquierda a derecha y multiplicas el resultado hasta el momento por 10 antes de sumar 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 mucha gente ya ha señalado, es el operador XOR . Mucha gente también ha señalado que si desea exponenciación, debe usar Math.pow .
Pero creo que también es útil señalar 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.
De aquí .
Estos operadores pueden resultar útiles cuando necesita leer y escribir en números enteros donde los bits individuales deben interpretarse como indicadores, o cuando un rango específico de bits en un número entero tiene un significado especial y desea extraer solo esos. Puede realizar gran parte de la programación diaria sin necesidad de utilizar estos operadores, pero si alguna vez tiene que trabajar con datos a nivel de bits, un buen conocimiento de estos operadores es invaluable.
Es XOR bit a bit, Java no tiene un operador de exponenciación, tendrías que usarlo Math.pow()
en su lugar.
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
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
Es el XOR
operador bit a bit.