2013-06-24 4 views
1

Прежде всего, я не эксперт в Python, так вот моя тема:Python инвертировать ряд

Я хочу, чтобы инвертировать число, скажем number = "ABCD123" (да это строка, но мне нужно, чтобы сделать это таким образом ...), проблема в том, что я действительно не удовлетворен тем, как Python справляется с инверсией, например ~0xABCD123 - -180146468, и я не хочу, чтобы MSB, но только «текущие» биты, которые нужно инвертировать. Я могу пойти с чем-то вроде ~0xABCD123 & 0XFFFFFFF, но размер номера может реально изменить ...

Вопрос

Есть ли способ, чтобы динамически «слепок» или удалить бит знака в Python с оператором ~

+1

И если вы хотите, чтобы делать то, что вы сказали, почему не так и с 16 ** (длина вашей строки) - 1? –

+0

например, у меня есть '0XD5', который является двоичным' 11010101', когда я делаю '~ 0xD5', результат равен' -214', но я хочу, чтобы результат был инвертирован как '00101010'. Возможно, я не понимаю концепцию Python '' ' – Jaay

+2

. В этом случае вам лучше XORing с FF..F. Я не думаю, что в Python есть целые числа без знака. –

ответ

4

простой хак:

def invert_int(n): 
    number_bit_len = n.bit_length() 
    max_val = (2 ** number_bit_len) - 1 
    return ~n & max_val 
+1

Вы можете заменить первые две строки на 'n.bit_length()', который также более надежным с большими целыми числами. Также использование '2 ** number_bit_len - 1' будет работать для любого целочисленного размера, а' math.pow' - для больших чисел. – Bakuriu

+0

Полезно знать :) –

+0

['bit_length'] (http://docs.python.org/dev/library/stdtypes.html#int.bit_length) только python 3 – Eric