2011-08-18 9 views
5

Ho bisogno di ottenere il bit n-esimo di un intero, sia firmato che non firmato, in Ruby.bit di estrazione in Ruby Integers

x = 123 # that is 1111011 
n = 2 # bit 2 is ...0 

il seguente pezzo di codice non funziona nel caso generale:

x.to_s(2)[-(n+1)] #0 good! but... 

a causa di numeri negativi non rappresentati da 2-complemento:

-123.to_s(2) # "-1111011" 

Così come procedere ?

risposta

12
x = 123 # that is 1111011 
n = 2 # bit 2 is ...0 

x[n] # => 0 

-123[2] # => 1 
+0

i risultati 1 e 0 sono invertiti. Ho provato a modificare il tuo post senza successo – JCLL

+0

@JCLL: Grazie! Questo è un caso in cui il "taglia e incolla" avrebbe effettivamente * prevenuto * un bug :-) –

+4

Heh, ancora un altro simpatico operatore Ruby: [] su Fixnum, in qualche modo sia chiaro come il giorno nei documenti, ma sepolto allo stesso tempo allo stesso tempo. – DigitalRoss

4
def f x, bit 
    (x & 1 << bit) > 0 ? 1 : 0 
end 
+0

E se si desidera solo un risultato vero/falso è possibile tralasciare il '? 1: 0' – DigitalRoss

3

Si potrebbe provare il Bindata lib.

C'è una funzione per rappresentare la rappresentazione binaria di un intero come una stringa, e dopo di ciò, puoi fare quello che ti piace con esso.