2016-03-21 17 views
2

Ich mag letzt n bisschen Zahl erhalten, zum Beispiel:Wie komme ich n Bit für Bit?

num = 0b111111111 
# if I want to get last 8 bits, it will be 0b11111111 
# if I want to get last 2 bits, it will be 0b11 

Ich dachte, dies in Ordnung sein kann:

bits = 1 << n 
little = num & (~bits) 

aber das ist falsch, wenn n = 8, es 0b110111111 bekommen

+0

Sie können keinen richtigen Wert erhalten, wenn Sie keine feste Länge ('num') haben, versuchen Sie:' new_num = bin (int (num)) [2:] .zfill (32) 'für 32-Bit-Zahlen (ohne Vorzeichen). Jetzt kann mit der Nummer gespielt werden: 'print new_num [-15: -3]' gleich '000000111111' (oder umgekehrt für positiven Index) – dsgdfg

Antwort

0

sollte Dieses arbeiten:

mask = (1 << n) - 1 
little = num & mask 

1 durch n fügt n Null-Bits nach dem 1 nach links verschoben:

>>> bin(0b1 << 4) 
'0b10000' 

Wenn Sie 1 von dieser subtrahieren Sie eine Maske haben, die n letzten Bits gesetzt hat:

>>> bin((0b1 << 4) - 1) 
'0b1111' 
1

Verwendung bits - 1:

>>> num = 0b111111111 
>>> n = 8 
>>> bits = 1 << n 
>>> num & (bits - 1) # bits - 1 => 0b1111111 because bits is 0b100000000 
255 
>>> bin(num & (bits - 1)) 
'0b11111111'