Chcę wyodrębnić bity liczby dziesiętnej.
Na przykład 7 jest binarne 0111 i chcę uzyskać 0 1 1 1 wszystkie bity przechowywane w bool. Jak mogę to zrobić?
OK, pętla nie jest dobrą opcją, czy mogę zrobić coś innego?
c
bit-manipulation
Badr
źródło
źródło
(n >> k) & 1
jest równie poprawny i nie wymaga obliczania maski, ponieważ maska jest stała z powodu przesunięcia przed maskowaniem zamiast na odwrót.struct
może być również przydatne, ponieważ wszystkie wymagane dane uzyskuje się za pomocą jednej operacji.Zgodnie z prośbą, zdecydowałem się rozszerzyć swój komentarz na temat odpowiedzi palca wskazującego na pełną odpowiedź. Chociaż jego odpowiedź jest prawidłowa, jest niepotrzebnie złożona. Ponadto wszystkie aktualne odpowiedzi używają znaku
int
s do reprezentowania wartości. Jest to niebezpieczne, ponieważ przesunięcie wartości ujemnych w prawo jest określone przez implementację (tj. Nie jest przenośne), a przesunięcie w lewo może prowadzić do nieokreślonego zachowania (patrz to pytanie ).Przesuwając w prawo żądany bit do najmniej znaczącej pozycji bitu, można wykonać maskowanie
1
. Nie ma potrzeby obliczania nowej wartości maski dla każdego bitu.Jako kompletny program oblicza (a następnie drukuje) tablicę wartości jednobitowych:
Zakładając, że chcesz obliczyć wszystkie bity tak jak w tym przypadku, a nie konkretny, pętlę można dalej zmienić na
To modyfikuje się
input
na miejscu, a tym samym pozwala na użycie jednobitowego przesunięcia o stałej szerokości, co może być bardziej wydajne na niektórych architekturach.źródło
Oto jeden sposób, aby to zrobić - jest wiele innych:
Trudno zrozumieć, dlaczego użycie pętli nie jest pożądane, ale łatwo ją rozwinąć:
Lub oceniając stałe wyrażenia w ostatnich czterech instrukcjach:
źródło
Oto bardzo prosty sposób na zrobienie tego;
źródło
@prateek dziękuję za pomoc. Przepisałem funkcję z komentarzami do użycia w programie. Zwiększ 8, aby uzyskać więcej bitów (do 32 dla liczby całkowitej).
źródło
Jeśli nie chcesz żadnych pętli, musisz to zapisać:
Jak pokazano tutaj, działa to również w inicjatorze.
źródło
źródło
Za pomocą
std::bitset
źródło