Foro de elhacker.net

Programación => Java => Mensaje iniciado por: *-.Sub-Vorbio.-* en 9 Noviembre 2008, 01:40 am



Título: Alguien me podría explicar por qué sucede esto :S
Publicado por: *-.Sub-Vorbio.-* en 9 Noviembre 2008, 01:40 am
El código es el siguiente. La duda viene relacionada con el operador "^" en Java.

Código:
public class Operador {

public static void main (String []args){

int a,b;
boolean t;
a = 3;
b = 8;

t = a <= b ^ b > a;

System.out.println("t:" + t);

}
}

Lo cual al ejecutar me imprime FALSE... (t: false)

No entiendo por qué sucede esto, ya que en el caso de “t“, “a“ debería ser menor o igual (<=) que “b“ (lo cual cumple) o (del tipo XOR a nivel de bit) “b“ debería ser mayor que “a“ (lo cual también cumple).

 No llego a entender este operador "^", alguien me lo podría explicar?. Gracias. Un saludo y disculpen las molestias.


Título: Re: Alguien me podría explicar por qué sucede esto :S
Publicado por: Dem0ny en 9 Noviembre 2008, 14:59 pm
Ostras, antes entendi mal lo que me decias y puse una cosa que no venia a cuento, aver prueba con esto, que ahoramismo yo no puedo probar el codigo.

Código
  1. public class Operador {
  2.  
  3. public static void main (String []args){
  4.  
  5. int a,b;
  6. boolean t;
  7. a = 3;
  8. b = 8;
  9.  
  10. t = (a <= b) || (b > a);
  11.  
  12. System.out.println("t:" + t);
  13.  
  14. }
  15. }
  16.  
  17.  


El "o" logico se representa mediante el operador ||, el "Y" mediante &&, etc

Saludos, pruebalo y dime




Edit!

tEstED! Right!

Citar
C:\>javac Prueba2.java

C:\>java Prueba2
t:true

C:\>


Título: Re: Alguien me podría explicar por qué sucede esto :S
Publicado por: *-.Sub-Vorbio.-* en 12 Noviembre 2008, 05:57 am
Pero el operador "^", que utilidad tiene, existinedo el "||" :s no lo entiendo...

Por lo que leo por algunos sitios no llego a comprenderlo...

Lo siguiente ha sido extraído de:

 "http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto/II_3.htm" (http://"http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto/II_3.htm")


Citar
b.) Operadores de lógica de bits

La lógica de bits (lógica de Bool) se utiliza para modelizar condiciones biestado y trabajar con ellas (cierto/falso, true/false, 1/0).

En Java hay cuatro operadores de lógica de bits:

Operador   
Uso   
Operación

&   
op1 & op2   
AND

|   
op1 | op2   
OR

^   
op1 ^ op2   
OR Exclusivo

~   
~op2   
Complemento



Tabla 15: Operadores de lógica de bits

El operador & realiza la operación AND de bit. Aplica la función AND sobre cada par de bits de igual peso de cada operando. La función AND es evaluada a cierto si ambos operandos son ciertos.

Por ejemplo vamos a aplicar la operación AND a los valores 12 y 13:

12 & 13

El resultado de esta operación es 12. ¿Por qué?. La representación en binario de 12 es 1100, y de 13 es 1101. La función AND pone el bit de resultado a uno si los dos bits de los operandos son 1, sino, el bit de resultado es 0:

   1101
 & 1100
  ------
   1100


El operador | realiza la operación OR de bit. Aplica la función OR sobre cada par de bits de igual peso de cada operando. La función OR es evaluada a cierto si alguno de los operandos es cierto.

El operador ^ realiza la operación OR exclusivo de bit (XOR). Aplica la función XOR sobre cada par de bits de igual peso de cada operando. La función XOR es evaluada a cierto si los operandos tienen el mismo valor.

Para finalizar, el operador de complemento invierte el valor de cada bit del operando. Convierte el falso en cierto, y el cierto en falso:

Entre otras cosas, la manipulación bit es útil para gestionar indicadores booleanos (banderas). Supongamos, por ejemplo, que se tiene varios indicadores booleanos en nuestro programa, los cuales muestran el estado de varios componentes del programa: esVisible, esArrastrable, etc... En lugar de definir una variable booleana para cada indicador, se puede definir una única variable para todos ellos. Cada bit de dicha variable representará el estado vigente de uno de los indicadores. Se deberán utilizar entonces manipulaciones de bit para establecer y leer cada indicador.

Primero, se deben preparar las constantes de cada indicador. Esos indicadores deben ser diferentes unos de otros (en sus bits) para asegurar que el bit de activación no se solape con otro indicador. Después se debe definir la variable de banderas, cuyos bits deben de poder ser configurados según el estado vigente en cada indicador.

El siguiente ejemplo inicia la variable de banderas flags a 0, lo que significa que todos los indicadores están desactivados (ninguno de los bits es 1):

final int VISIBLE = 1;

final int ARRASTRABLE = 2;

final int SELECCIONABLE = 4;

final int MODIFICABLE = 8;

int flags = 0;

Para activar el indicador VISIBLE, se deberá usar la sentencia:

flags = flags | VISIBLE;

Para comprobar la visibilidad se deberá usar la sentencia:

if ( (flags & VISIBLE) == 1 )

  //Lo que haya que hacer


Título: Re: Alguien me podría explicar por qué sucede esto :S
Publicado por: juancho77 en 12 Noviembre 2008, 06:03 am
No se bien a que te refieres, pero alli no estas trabajando con bits. Los operadores relacionales en Java que deberias usar son &(&) o |(|).


Título: Re: Alguien me podría explicar por qué sucede esto :S
Publicado por: *-.Sub-Vorbio.-* en 12 Noviembre 2008, 07:05 am
No me he sabido explicar bien. Todo sale de este ejercicio:

Código:
Cree una clase denominada Ejercicio. Dentro de ella cree un método main y dentro de él
teclee lo siguiente:
int a,b;
boolean r,s,t;
a = 3;
b = 8;
r = a == 0 | b >= a;
s = a != 0 & b < a;
t = a <= b ^ b > a;
System.out.println(“r:” + r);
System.out.println(“s:” + s);
System.out.println(“t:” + t);
¿Cuál es el resultado del código anterior? ¿Por qué?

Al poner el código:

Código:
public class Ejercicio26 {

public static void main (String []args){

int a,b;
boolean r,s,t;
a = 3;
b = 8;
r = a == 0 | b >= a;
s = a != 0 & b < a;
t = a <= b ^ b > a;
System.out.println("r:" + r);
System.out.println("s:" + s);
System.out.println("t:" + t);

}
}

Se imprime:

Código:
r:true
s:false
t:false

y el último false no se explicarme por qué sucede.. :S


Título: Re: Alguien me podría explicar por qué sucede esto :S
Publicado por: ~~ en 12 Noviembre 2008, 15:49 pm
Funciona bien:

Código
  1. public static void main(String[] args) {
  2.        int a,b;
  3. boolean r,s,t;
  4. a = 3;
  5. b = 8;
  6. r = (a == 0) || (b >= a); // false OR true  = TRUE
  7. s = (a != 0) && (b < a);  // true AND false = FALSE
  8. t = (a <= b) ^ (b > a);   // true XOR true  = FALSE
  9. System.out.println("r:" + r);
  10. System.out.println("s:" + s);
  11. System.out.println("t:" + t);
  12.    }

Puedes mirar las tablas de verdad de las operaciones lógicas aquí:
http://es.wikipedia.org/wiki/Compuerta_l%C3%B3gica

Y cuidado con la prioridad de operandos, si dudas usa paréntesis
Salu2


Título: Re: Alguien me podría explicar por qué sucede esto :S
Publicado por: *-.Sub-Vorbio.-* en 12 Noviembre 2008, 17:33 pm
Se agradece EON, ya lo entendí, al menos el requisito de imparidad. Estaba ofuscado en interpretarlo como un OR. Un saludo.