Оператор '~' определяется как: «Побитовая инверсия x определяется как - (x + 1). Она применяется только к целым числам.» Python Doc - 5.5
Важной частью этого предложения является то, что это связано с «целыми числами» (также называемыми целыми числами).В вашем примере представлено 4-битное число.
'0001' = 1
Целочисленный диапазон 4-битного числа - '-8..0..7'.С другой стороны, вы можете использовать «целые числа без знака», которые не включают отрицательное число, а диапазон для вашего 4-битного числа будет «0..15».
Поскольку Python работает с целыми числами, поведение, которое вы описалиожидается.Целые числа представлены с помощью дополнения до двух.В случае 4-битного числа это выглядит следующим образом.
7 = '0111'
0 = '0000'
-1 = '1111'
-8 = '1000'
Python использует 32-битное целочисленное представление в случае, если у вас 32-битная ОС.Вы можете проверить наибольшее целое число с помощью:
sys.maxint # (2^31)-1 for my system
Если вы хотите, чтобы целое число без знака вернуло для вас 4-битное число, вы должны замаскировать.
'0001' = a # unsigned '1' / integer '1'
'1110' = ~a # unsigned '14' / integer -2
(~a & 0xF) # returns 14
Если вы хотите получитьдиапазон 8-разрядных чисел без знака (0..255) вместо этого просто используйте:
(~a & 0xFF) # returns 254