Maska bitowa w C
Jaki jest najlepszy sposób na wykreślenie maski bitowej w języku C z ustawieniem
mbitów poprzedzonych przez
k, a następnie ustawieniem
n:
00..0 11..1 00..0
k m n
Na przykład k = 1, m = 4, n = 3 spowoduje powstanie maski bitowej:
01111000
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
5 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
EDIT:
Wystąpił błąd w mojej poprzedniej wersji (nie miała ona rzutowania typu unsigned int). Problem polegał na tym, że dodaje 1 z przodu, a nie 0.
I tak, to podejście ma jedną wielką wadę: zakłada, że znasz liczbę bitów standardowego typu liczby całkowitej, czyli innymi słowy, zakłada, że znasz k, podczas gdy inne rozwiązania nie zależą od k. To sprawia, że moja wersja jest mniej przenośna lub przynajmniej trudniejsza do przeniesienia. (Wykorzystuje również 3 przesunięcia, dodawanie i operator negacji bitowej, które są dwiema dodatkowymi operacjami).
Dlatego lepiej użyj jednego z innych przykładów.
Oto mała aplikacja testowa wykonana przez Jonathana Lefflera w celu porównania i przetestowania wyników różnych rozwiązań:
Anonimowy użytkownik
Potwierdzenie od:
Instrukcja usuwa najbardziej znaczące bity z określonej pozycji bitu.
Funkcja wewnętrzna jest kompilowana do tej instrukcji. Kod testowy:
Wyjście:
Fragment kodu składa się z trzech instrukcji
To o jedną instrukcję mniej niż kody @ Jonathan
Leffler
https://stackoverflow.com/a/316494/2439725
i
@Darius Bacon
https://stackoverflow.com/a/316493/2439725
.
W procesorach Intel Haswell lub nowszych zarówno , jak i mają 1 cykl latencji i
przepustowość 2 na cykl. Na AMD Ryzen te dwie instrukcje mają nawet przepustowość 4 na cykl.
Anonimowy użytkownik
Potwierdzenie od:
= = Moja sugestia dotycząca 32-bitowego słowa bez znaku (które jest brzydkie i ma gałąź) wygląda następująco:
To faktycznie zwraca bity z zakresu
[m, n]
(przedział zamknięty), więc zwróci maskę dla pierwszego BITU (bit 0) , podczas gdy zwróci maskę dla bitów od 4 do 6, tj. .