¿Qué hace el operador ^ en Java?

Resuelto joroj asked hace 14 años • 0 respuestas

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

joroj avatar Jan 02 '10 18:01 joroj
Aceptado

El operador ^ en Java

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

Tomemos 5^6como 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 intsi 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"sinintusarlaInteger.parseIntcomo 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
polygenelubricants avatar Apr 20 '2010 02:04 polygenelubricants

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.

Mark Byers avatar Jan 02 '2010 11:01 Mark Byers

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

Dan Dyer avatar Jan 02 '2010 11:01 Dan Dyer

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
Sachin Ambalkar avatar Nov 04 '2017 02:11 Sachin Ambalkar

Es el XORoperador bit a bit.

Khaled Alshaya avatar Jan 02 '2010 11:01 Khaled Alshaya