Łatwo. Użyj bitowego AND, aby porównać swoją liczbę z wartością 2 ^ bitNumber, którą można tanio obliczyć przez przesunięcie bitów.
//your black magic
var bit = (b & (1 << bitNumber-1)) != 0;
EDYTUJ: Aby dodać trochę więcej szczegółów, ponieważ istnieje wiele podobnych odpowiedzi bez wyjaśnienia:
Bitowe AND porównuje każdą liczbę, bit po bicie, używając sprzężenia AND w celu uzyskania liczby będącej kombinacją bitów, w której ustawiono zarówno pierwszy, jak i drugi bit w tym miejscu. Oto macierz logiczna logiki AND w „nibble”, która przedstawia operację bitowego AND:
0101
& 0011
----
0001 //Only the last bit is set, because only the last bit of both summands were set
W twoim przypadku porównujemy podaną liczbę z liczbą zawierającą tylko ten bit, którego szukasz. Powiedzmy, że szukasz czwartego bitu:
11010010
& 00001000
--------
00000000 //== 0, so the bit is not set
11011010
& 00001000
--------
00001000 //!= 0, so the bit is set
Przesuwanie bitów w celu uzyskania liczby, z którą chcemy porównać, jest dokładnie tym, co brzmi: weź liczbę, reprezentowaną jako zestaw bitów i przesuń te bity w lewo lub w prawo o określoną liczbę miejsc. Ponieważ są to liczby binarne, a więc każdy bit jest o jedną potęgę dwójki większy niż ten po prawej stronie, przesunięcie bitu w lewo jest równoważne dwukrotnemu podwojeniu liczby dla każdego przesuniętego miejsca, co jest równoznaczne z pomnożeniem liczby przez 2 ^ x. W Twoim przykładzie, szukając czwartego bitu, wykonujemy:
1 (2^0) << (4-1) == 8 (2^3)
00000001 << (4-1) == 00001000
Teraz wiesz, jak to się robi, co się dzieje na niskim poziomie i dlaczego to działa.
var bit = (b & (1 << bitNumber-1)) != 0
;Chociaż dobrze jest przeczytać i zrozumieć odpowiedź Josha, prawdopodobnie będziesz szczęśliwszy, używając do tego celu klasy firmy Microsoft: System.Collections.BitArray Jest dostępna we wszystkich wersjach .NET Framework.
źródło
To
powinienem to zrobić, myślę.
źródło
inny sposób na zrobienie tego :)
źródło
((2 >> 1)&1)
jest1
i((2 >> 0)&1)
to0
dlatego, że 2 to00000010
Działa to szybciej niż 0,1 milisekundy.
źródło
Korzystanie z klasy BitArray i tworzenie metody rozszerzającej zgodnie z sugestią OP:
źródło
Spróbuj tego:
źródło
Metoda polega na użyciu innego bajtu wraz z bitowym AND, aby zamaskować bit docelowy.
Użyłem konwencji z moich zajęć, gdzie „0” jest najbardziej znaczącym bitem, a „7” najmniejszym.
źródło
Wypróbuj poniższy kod. Różnica w stosunku do innych postów polega na tym, że możesz ustawić / pobrać wiele bitów za pomocą maski (
field
). Maska dla czwartego bitu może na przykład wynosić 1 << 3 lub 0x10.** Przykład **
źródło
źródło