alguno puede ayudarme con el desplazamiento y posicionamiento de bits en python

Iniciado por Joe Fraddy, 20 Febrero 2015, 06:24 AM

0 Miembros y 1 Visitante están viendo este tema.

Joe Fraddy

Lo que tengo que hacer es:

01 Vamos a crear una función invierte_bit que tome los datos de entrada (numero, n).
02 Invertimos el nth bit (con los bit de unos siendo el primer bit) y lo guardamos en resultado.
03Return the result of calling bin(result).

y tengo este código:

Código (python) [Seleccionar]
def invierte_bit(numero, n):
    resultado=numero<<n
    return bin(resultado)

nth=0b10
bit=2
print invierte_bit(nth, bit)


Pero me parece que esta mal, porque no es solo un error lógico sino de comprensión.

engel lex

no estoy seguro de entender...

lo que te piden es invertir el bit(si es 1 lo convierte en 0 y viceversa) escogido a un numero ingresado?

porque lo que estás haciendo es desplazamiento de bits, en tal caso necesitas es invertir...

lo puedes hacer con XOR ya que si es 1 al hacer XOR 1 da 0 y si es 0 XOR 1 da 1


en tal caso procedimiento es
Código (python) [Seleccionar]
numero^n
(no confundir "^" con potencia, potencia en python se representa con "**")

te recomiendo para el nth bit lo hagas con desplazamiento
Código (python) [Seleccionar]
mascara = 1<<(bit_escogido -1)

es decir, el 4to bit sería
Código (python) [Seleccionar]
bit_escogido = 4
mascara = 1<<(bit_escogido -1)

máscara sería igual que 0b1000
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Joe Fraddy

No aun no logro entender:

Esta es la clase:

Posicionate y desplazate
Finalmente, también podés utilizar los operadores a nivel de bits de desplazamiento a la izquierda (<<) y a la derecha (>>) para desplazar máscaras a la posición correspondiente.

Código (python) [Seleccionar]
a = 0b101
# mascara diez bits
mascara = (0b1 << 9)  # Uno menos que diez
deseado = a ^ mascara


Supongamos que quiero encender el décimo bit, comenzando desde la derecha de un entero a.

En lugar de ingresar toda la serie numérica, puedo desplazarme utilizando el operador <<.

Utilizamos el 9, porque solamente necesitamos desplazar la máscara nueve lugares, comenzando desde la derecha, para llegar al décimo bit.

Instrucciones
1. Vamos a crear una función invierte_bit que tome los datos de entrada (numero, n).
2. Invertimos el nth bit (con los bit de unos siendo el primer bit) y lo guardamos en resultado.
3. Devolver el resultado llamando a bin(resultado).

engel lex

si... teoricamente es así..., para la mascara no es necesario que escribas "0b1" ya que 1 es 1 en binario, octal, decimal, hexadecimal, etc... 1 es 1


si quieres encender con OR siempre servirá



El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Joe Fraddy

Creo que sigo sin entender, porque lo hago así y no me resulta:

Código (python) [Seleccionar]
def invierte_bit(numero, n):
    resultado = 1<<(n -1)
    return bin(resultado)
num=2
x=0b111

print invierte_bit(num,x)

engel lex

no da resultado porque no usaste "numero" dentro de la función :silbar:

eso pasa porque has pasado mucho tiempo trancado y trabajando eso XD


deja eso de lado por un rato, y ponte a experimentar con codigo, a usar los desplazamientos, los operadores logicos y ve como funcionan bien... leete bien los 2 textos de wikipedia que te deje en el otro post
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Joe Fraddy

Gracias por las recomendaciones, ya quedó el código:

Código (python) [Seleccionar]
def invierte_bit(numero, n):
    mask = (0b1<<n-1)
    resultado = numero ^ mask
    return bin(resultado)


Creo que todavía me falta estudiar mas a fondo este asunto de los bits xD

engel lex

deberías confirmar que "numero" nunca sea menor de 1, si no la pc explota :P
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Joe Fraddy

Jajaja, ok, es que apenas estoy aprendiendo y se me pasan todavía algunas cosas xD