2011-08-18 13 views
5

Potrzebuję uzyskać n-ty bit liczby całkowitej, podpisanej lub niepodpisanej, w Ruby.Bit ekstraktu w Ruby Integers

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

Poniższy fragment kodu nie działa w przypadku ogólnym:

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

powodu liczb ujemnych nie reprezentowanych jako 2-uzupełnienie:

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

Więc jak postępować ?

Odpowiedz

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

x[n] # => 0 

-123[2] # => 1 
+0

wyniki 1 i 0 są odwrócone. Próbowałem edytować twój wpis bez powodzenia – JCLL

+0

@JCLL: Dzięki! To jest jeden przypadek, w którym wycinanie i wklejanie faktycznie * uniemożliwiło * błąd :-) –

+4

Heh, kolejny fajny operator Ruby: [] na Fixnum, jakoś tak zwyczajnie jak na dzień w dokumentach, ale zakopany poza zasięgiem wzroku w tym samym czasie. – DigitalRoss

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

A jeśli chcesz tylko wynik prawdziwy/fałszywy możesz pominąć '? 1: 0' – DigitalRoss

3

Możesz wypróbować Bindata lib.

Istnieje funkcja reprezentująca binarną reprezentację liczby całkowitej jako ciąg znaków, a po tym można zrobić z nią to, co się chce.