Foros del Web » Programando para Internet » Python »

operadores logicos

Estas en el tema de operadores logicos en el foro de Python en Foros del Web. tengo un problemilla con los operadores logicos de python. Intengo conseguir que un numero sea par y me falla este código: Código: c = random.randint(2**(nbits-1),2**nbits) ...
  #1 (permalink)  
Antiguo 01/06/2012, 18:39
 
Fecha de Ingreso: abril-2011
Ubicación: Motril
Mensajes: 49
Antigüedad: 13 años, 7 meses
Puntos: 1
Pregunta operadores logicos

tengo un problemilla con los operadores logicos de python. Intengo conseguir que un numero sea par y me falla este código:

Código:
	c = random.randint(2**(nbits-1),2**nbits)
	c = c|0			# c es par
si pongo c|1 si me lo hace impar, y se que hay otras formas de hacerlo par, pero tengo que hacer mas operaciones a nivel de bits y quiero saber porque falla esto antes de que me de problemas con otras cosas.
  #2 (permalink)  
Antiguo 01/06/2012, 20:54
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: operadores logicos

Lo que tu quieres hacer es:
Código Python:
Ver original
  1. c &= -2 # Convertir c a par
o
Código Python:
Ver original
  1. c <<= 1
  2. c >>= 1

Ok vamos a analizar por que:

AND siempre es falso, a menos que ambos lados sean verdadero.
OR siempre es verdadero, a menos que ambos lados sean falsos.

Entonces para limpiar (o poner a cero) un bit lo mas conveniente sería usar un AND, si tenemos un 0 en el AND ya no nos importa cual sea el otro valor, el resultado va a ser 0. Esto se llama short circuit en los operadores booleanos.

Ejemplo:
Código:
c = 5
  101  <-- c
& 110
------
  100
Entonces ¿como podemos hacer esto?
La solución mas directa es usar desplazamiento de carro.
Código:
>>> c = 101
101
>>> c = c << 1
10
>>> c = c >> 1
100
Otra solución seria poner todos los bits a 1 con excepción del primero y hacer un AND. Esto es un valor "mágico". El cual sucede que es -2, ver complemento 2 para entender esto.
  #3 (permalink)  
Antiguo 02/06/2012, 07:57
 
Fecha de Ingreso: abril-2011
Ubicación: Motril
Mensajes: 49
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: operadores logicos

Cuando me desperte esta mañana me di cuenta que eso estaba mal. jejeje
Gracias, vale con c &= -2. Ya probe el doble desplazamiento y servia, pero lo que yo queria era esto.
  #4 (permalink)  
Antiguo 02/06/2012, 09:50
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: operadores logicos

Ahora no sabre lo que quieres hacer.

Pero vamos a adivinar.

¿Quieres checar si el numero es par?
Código Python:
Ver original
  1. c & 1 #0 si es par, 1 si es impar
  #5 (permalink)  
Antiguo 04/06/2012, 07:17
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: operadores logicos

Como nota adicional: espero que esto lo estés haciendo por algún ejercicio y no por optimización: hacer esta clase de optimizaciones en un lenguaje de alto nivel, la mayoría de las veces es perder el tiempo.


Saludos.

Etiquetas: logico, operador
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:09.