Cómo obtener el cambio binario lógico correcto en python

Según lo revelado por el título. En JavaScript hay un operador específico ‘>>>’. Por ejemplo, en JavaScript tendremos el siguiente resultado:

(-1000) >>> 3 = 536870787

(-1000) >> 3 = -125

1000 >>> 3 = 125

1000 >> 3 = 125

Entonces, ¿hay un cierto método u operador que represente este ‘>>>’?

No hay un operador integrado para esto, pero puedes simular fácilmente el >>> tú 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 if :

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

No, no hay. El cambio a la derecha en python es aritmético.

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

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

Puede hacer un relleno a nivel de bit con ceros con el módulo de cadena de bits utilizando el operador >> = :

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

Tratar de voltear el bit de signo de un número negativo enmascarándolo con 0x100000000 es fundamentalmente erróneo, ya que hace suposiciones difíciles sobre la longitud de la palabra. En mi tiempo como progtwigdor, he trabajado con números de 24, 48, 16, 18, 32, 36 y 64 bits. También he oído hablar de máquinas que funcionan en longitudes impares, como 37 y otras que usan aritmética de complemento a uno, y no a complemento de dos. Cualquier suposición que haga sobre la representación interna de números, más allá de que sean binarios, es peligrosa.

Incluso el supuesto binario no es absolutamente seguro, pero creo que lo permitiremos. 🙂

Aquí hay un resumen de la respuesta de Aix . El operador de cambio a la derecha normal funcionará si le da un valor positivo, por lo que realmente está buscando una conversión de firmado a sin firmar.

 def unsigned32(signed): return signed % 0x100000000 >>> unsigned32(-1000) >> 3 536870787L 

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

Aquí está mi implementación:

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