Как преодолеть два дополнения в Python? - PullRequest
0 голосов
/ 25 ноября 2018

Как преодолеть нотацию Python в двух дополнениях и получить 0b011111111111111 в последнем результате?Можно ли сделать это математически?Просто уже несколько часов не могу понять ...

output = 0xFFFF
for i in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15):
    a = 1 << i
    print(bin(output^a))

Результат:

0b1111111111111110 ✅
0b1111111111111101 ✅
0b1111111111111011 ✅
0b1111111111110111 ✅
0b1111111111101111 ✅
0b1111111111011111 ✅
0b1111111110111111 ✅
0b1111111101111111 ✅
0b1111111011111111 ✅
0b1111110111111111 ✅
0b1111101111111111 ✅
0b1111011111111111 ✅
0b1110111111111111 ✅
0b1101111111111111 ✅
0b1011111111111111 ✅
0b111111111111111  ❌  <<<< how to make this equal to 0b011111111111111 ?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вы также можете сделать это, используя метод rjust:

output = 0xFFFF
for i in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15):
    a = 1 << i
    print('0b' + bin(output^a)[2:].rjust(16,'0'))

Как указывал @wim, вы можете использовать zfill для заполненияс нулями:

print('0b' + bin(output^a)[2:].zfill(16))
0 голосов
/ 25 ноября 2018

Чтобы напечатать двоичные цифры с начальными нулями , используйте форматирование строки.Например, чтобы запросить 16 бит с начальным нулевым заполнением:

print("0b" + format(output^a, "016b"))

Если у вас есть доступные f-строки (Python 3.6 +):

>>> f"0b{output^a:016b}"
'0b0111111111111111'

К инвертироватьчисло без изменения длины в битах , вот математический трюк:

>>> n = 7
>>> f"0b{n:b}"
'0b111'
>>> L = n.bit_length()
>>> f"0b{2**L-1-n:0{L}b}"
'0b000'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...