. Zor olan kısım, Python'un sınırsız uzunluklu tam sayılara sahip olmasıdır, bu yüzden bir sayıyı ters çevirdiğinizde - en azından kavramsal olarak - sonsuz sayıda 1 ile genişletilmiş işarettir. Anlamı negatif sayılar olsun.
>>> bin(~0b101)
'-0b110'
>>> bin(~0b10101)
'-0b10110'
Bunları imzasız numaralara dönüştürmek için, kaç tane önem verdiğinize karar vermeniz gerekir. Belki 8 bitlik baytlarla çalışıyorsunuzdur.
>>> bin(~0b101 & 0xFF)
'0b11111010'
>>> bin(~0b10101 & 0xFF)
'0b11101010'
Yoksa girdi numaralarının tam bit uzunluğunu eşleştirmek istiyorsanız, çözüm makul: Sonra 1 bit byte'ın yetmeyecek ile olabilir VE onlar. Verimlilik için sol kayma için üssü değiştirebilirsin. Ve ^
yerine ~
ve &
kullanmak daha net olabilir.
>>> bin(~a & ((1 << a.bit_length()) - 1))
'0b10'
>>> bin(~b & ((1 << b.bit_length()) - 1))
'0b1010'
(I
& 0xFFFF
gibi kodlanmış maske pratikte doğru çözüm olacaktır sanıyorum. Ben
bit_length()
tabanlı cevap için iyi bir gerçek dünya senaryosunun düşünemiyorum.)
sorabilir miyim: Bunun yerine sayı kendisi genişliğini kullanmak yerine belirli bir genişliğe sınırlandırabilirsiniz Eğer
, o zaman (32 bit örneğini kullanarak) basit bir mesele var niye ya? 'Bin' temsilinin sizi şaşırttığı olasıdır. '~ 'bitleri ters çevirir; sadece bitlerin * sonsuz sayısını * dönüştürür, bu da metinsel olarak temsil edilmesini imkansız kılar. 'bin' böylece çalışmasını sağlamak için bazı şeylerle uğraşır, ama tüm bitlerin ters çevrildiğini gizlemek biter. – Veedrac
@Veedrac 16bit vm uyguluyorum. –
Bence yolların yeterince iyi, pythonun bunu yapmanın doğal bir yolu olduğunu düşünmeyin. Küçük bir değişiklik, güçler yerine bitshift kullanarak olabilir. – simonzack