Подтвердить что ты не робот

Два дополнения чисел в python

Я пишу код, который будет иметь отрицательные и положительные числа, все 16 бит в длину, причем MSB является знаком aka two supplement. Это означает, что наименьшее число, которое у меня есть, составляет -32768, которое 1000 0000 0000 0000 в двух дополнительных формах. Наибольшее число, которое у меня есть, - 32767, которое 0111 1111 1111 1111.

Проблема, с которой я сталкиваюсь, это python, представляющий отрицательные числа с тем же двоичным обозначением, что и положительные числа, просто помещая знак минус перед фронтом, т.е. -16384 отображается как -0100 0000 0000 0000, что я хочу для отображения для числа, такого как -16384, есть 1100 0000 0000 0000.

Я не совсем уверен, как это можно закодировать. Это код, который у меня есть. По существу, если число между 180 и 359 будет отрицательным. Мне нужно отобразить это как значение комплимента twos. У меня нет кода о том, как отображать его, потому что я действительно не знаю, как это сделать.

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
4b9b3361

Ответ 1

Если вы делаете что-то вроде

format(num, '016b')

чтобы преобразовать ваши числа в представление с двумя дополнительными строками, вы хотите фактически взять два дополнения отрицательного числа перед его изложением:

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

или возьмите его mod 65536:

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

Ответ 2

Два дополнения к значению - это одно дополнение плюс одно.

Вы можете написать свою собственную функцию преобразования на основе этого:

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

Результат выглядит следующим образом:

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

Изменить: для отображения битов без минуса спереди вы можете использовать эту функцию:

def to_twoscomplement(bits, value):
    if value < 0:
        value = ( 1<<bits ) + value
    formatstring = '{:0%ib}' % bits
    return formatstring.format(value)

>>> to_twoscomplement(16, 3)
'0000000000000011'
>>> to_twoscomplement(16, -3)
'1111111111111101'

Ответ 3

Если вы действительно хотите сохранить номера с использованием 16 бит, вы можете использовать struct.

import struct

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

Вы можете распаковать с помощью unpack

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

Ответ 4

Поскольку вы не приводили примеры кода, я не могу быть уверенным, что происходит. Основываясь на числах в вашем примере, я не думаю, что вы используете bin(yourint), потому что вы не используете 0b. Возможно, вы уже разрезаете это в своих примерах.

Если вы сохраняете свои двоичные данные в виде строк, вы можете сделать что-то вроде:

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