El complemento de dos números en Python.

Estoy escribiendo un código que tendrá números negativos y positivos de 16 bits de largo, siendo el MSB el complemento del signo alias dos. Esto significa que el número más pequeño que puedo tener es -32768 que es 1000 0000 0000 0000 en forma de complemento a dos. El número más grande que puedo tener es 32767, que es 0111 1111 1111 1111 .

El problema que tengo es que Python representa los números negativos con la misma notación binaria que los números positivos, simplemente poniendo un signo menos en la parte frontal, es decir, -16384 se muestra como -0100 0000 0000 0000 lo que quiero que se muestre para un número como : 16384 es 1100 0000 0000 0000 .

No estoy muy seguro de cómo se puede codificar esto. Este es el código que tengo. Esencialmente, si el número está entre 180 y 359, será negativo. Necesito mostrar esto como un valor de dos complementos. No tengo ningún código sobre cómo mostrarlo porque realmente no tengo idea de cómo hacerlo.

 def calculatebearingActive(i): numTracks = trackQty_Active bearing = (((i)*360.0)/numTracks) if 0< bearing <=179: FC = (bearing/360.0) FC_scaled = FC/(2**(-16)) return int(FC_scaled) elif 180<= bearing <=359: FC = -1*(360-bearing)/(360.0) FC_scaled = FC/(2**(-16)) return int(FC_scaled) elif bearing ==360: FC = 0 return FC 

Si estas haciendo algo como

 format(num, '016b') 

para convertir sus números en una representación de cadena de complemento a dos, querrá tomar el complemento de dos de un número negativo antes de estratificarlos:

 format(num if num >= 0 else (1 << 16) + num, '016b') 

o 65536 mod 65536 :

 format(num % (1 << 16), '016b') 

El complemento de dos de un valor es el complemento de uno más uno.

Puedes escribir tu propia función de conversión basada en eso:

 def to_binary(value): result = '' if value < 0: result = '-' value = ~value + 1 result += bin(value) return result 

El resultado se ve así:

 >>> to_binary(10) '0b1010' >>> to_binary(-10) '-0b1010' 

Editar: para mostrar los bits sin el signo menos en frente, puede utilizar esta función:

 def to_twoscomplement(bits, value): if value < 0: value = ( 1<>> to_twoscomplement(16, 3) '0000000000000011' >>> to_twoscomplement(16, -3) '1111111111111101' 

Si realmente quiere almacenar los números usando 16 bits, puede usar struct.

 import struct >>> struct.pack('h', 32767) '\xff\x7f' >>> struct.pack('h', -32767) '\x01\x80' 

Puedes descomprimir usando unpack

 >>> a = struct.pack('h', 32767) >>> struct.unpack('H', a) 32767 

Como no ha dado ningún ejemplo de código, no puedo estar seguro de lo que está pasando. Según los números en su ejemplo, no creo que esté usando bin(yourint) porque su salida no contiene 0b . Tal vez ya estás reduciendo eso en tus ejemplos.

Si está almacenando sus datos binarios como cadenas, podría hacer algo como:

  def handle_negatives(binary_string): If binary_string < 0: binary_string = '1' + str(binary_string)[1:] Return binary_string