Попробуйте:
byte1 = 251
byte2 = 74
byte_mask = ~0xFFFF
if (byte1>=128):
result = ( ((byte1 << 8) + byte2) | byte_mask ) >> 4
else:
result = ((byte1 << 8) + byte2) >> 4
Подробнее:
Мы все знаем, что такое дополнение 2 ... если самый левый бит равен 1, число является отрицательным, и мы должны выполнить дополнение 2, чтобы получить число. Это легкая часть. Сложность в том, что вы работаете в Python. Нумерация Python - это благословение и проклятие, потому что числа Python бесконечны (грубо говоря). Нам нужно как-то установить все самые левые биты бесконечного числа в 1, так что вы можете сделать:
byte_mask = ~0xFFFF
Теперь byte_mask - 1111 1111 1111 1111 1111 1111 ..... 0000 0000 0000 0000
Если ваш входящий байт1 больше 128 (и, следовательно, отрицательное число), мы просто ИЛИ ваш номер байта1, получая промежуточный результат:
1111 1111 1111 1111 ..... 1111 1011 0100 1010
Что явно намного ближе к тому, что мы хотим. Затем сдвиньте вправо 4. (Когда мы сдвигаемся вправо, самые левые 4 цифры будут заполнены, конечно же, 1):
1111 1111 1111 1111 ..... 1111 1111 1011 0100
Что в десятичном виде вы хотите: -76