2011-04-29 27 views

Respuesta

28

No es un operador integrado para esto, pero se puede simular fácilmente la >>> mismo:

>>> def rshift(val, n): return val>>n if val >= 0 else (val+0x100000000)>>n 
... 
>>> rshift(-1000, 3) 
536870787 
>>> rshift(1000, 3) 
125 

La siguiente implementación alternativa elimina la necesidad de que el if:

>>> def rshift(val, n): return (val % 0x100000000) >> n 
+2

'(val + 0x100000000)% 0x100000000)' es 'val% 0x100000000'. –

+1

@Baffe Boyois: en Python ciertamente no lo es (el resultado siempre es positivo, mientras que el primer operando puede tener cualquier signo). – NPE

+2

Ejemplo? Tenga en cuenta que '-1% 3 == 2' en Python. ["El operador de módulo siempre arroja un resultado con el mismo signo que su segundo operando (o cero)"] (http://docs.python.org/reference/expressions.html#binary-arithmetic-operations) –

6

No, no lo hay. El cambio correcto en Python es aritmético.

+0

Así es este incluido en algún paquete de todos modos? – dementrock

+0

Ninguno que yo sepa. – Femaref

+0

Dado que Python no tiene números sin signo, solo tiene sentido que no incluya los cambios sin signo. –

3

Numpy proporciona la función right_shift() que hace esto:

>>> import numpy 
>>> numpy.right_shift(1000, 3) 
125 
+3

¿Pero no es solo el operador '>>'? Si intento 'numpy.right_shift (-1000, 3)' obtengo '-125' no' 536870787'. –

+0

¡Estaré maldito! – jathanism

2

se puede hacer un relleno de desplazamiento bit a bit con ceros con el módulo bitstring utilizando el operador >>=:

>>> a = BitArray(int=-1000, length=32) 
>>> a.int 
-1000 
>>> a >>= 3 
>>> a.int 
536870787 
+0

Girar no es lo mismo que cambio. –

+0

@Mark: Punto justo: no entendí lo que el operador >>> estaba haciendo. Corregido ahora. –

1

Aquí es un spin-off de aix's answer. El operador normal de desplazamiento a la derecha funcionará si le das un valor positivo, por lo que realmente estás buscando una conversión de firmado a no firmado.

def unsigned32(signed): 
    return signed % 0x100000000 

>>> unsigned32(-1000) >> 3 
536870787L 
1

Tratando de darle la vuelta al bit de signo de un número negativo enmascarando con 0x100000000 es errónea, ya que fundamentalmente hace suposiciones difíciles acerca de la longitud de palabra. En mi época como programador, trabajé con números de 24, 48, 16, 18, 32, 36 y 64 bits. También he oído hablar de máquinas que trabajan en longitudes impares, como 37 y otras que usan complementos, y no dos, de complemento, aritmética. Cualquier suposición que haga sobre la representación interna de los números, más allá de que sean binarios, es peligrosa.

Incluso la suposición binaria no es absolutamente segura, pero creo que lo permitiremos. :)

1

Debe recordar que si el número es negativo, se establece el bit superior y con cada desplazamiento a la derecha debe establecer también el bit superior.

Aquí es mi aplicación:

def rshift(val, n): 
    s = val & 0x80000000 
    for i in range(0,n): 
     val >>= 1 
     val |= s 
    return val 
Cuestiones relacionadas