Вот еще пара функций, которые возвращают дополнение числа, с которым я выступил.
Однострочный:
def complement(c):
return c ^ int('1'*len(format(c, 'b')), 2)
Более математический способ:
def complement(c):
n=0
for b in format(c, 'b'): n=n<<1|int(b)^1
return n
Более того, добавление одного последнего элемента в соответствие с functools (например, в стиле барокко):
def complement(c):
return functools.reduce( lambda x,y: x<<1|y, [ int(b)^1 for b in format(c, 'b') ])
Наконец, бесполезный занудный вариант первого, который использует math.log для подсчета двоичного кода.цифры:
def complement(c):
c ^ int('1' * math.floor(math.log((c|1)<<1, 2)), 2)