Jestem dość nowy w programowaniu w języku C i natrafiłem na maskowanie bitowe. Czy ktoś może mi wyjaśnić ogólną koncepcję i funkcję maskowania bitowego? Przykłady są doceniane.Co to jest maskowanie bitowe?
Odpowiedz
Maska określa, które bity chcesz zachować i które bity chcesz wyczyścić.
Maskowanie jest aktem stosowania maski do wartości. Osiąga się to przy pomocy:
- mnożenie logiczne w celu wyodrębnienia podzestaw bitów wartości
- sumowanie logiczne w celu ustalenia podzestaw bitów wartości
- Bitowe XORing w celu przełączyć się podzestaw bitów wartości
Poniżej przedstawiono przykład ekstrakcji podzestaw bitów wartości:
Mask: 00001111b
Value: 01010101b
Zastosowanie maski do wartości oznacza, że chcemy wyczyścić pierwsze (wyższe) 4 bity i zachować ostatnie (niższe) 4 bity. W ten sposób wyodrębniliśmy niższe 4 bity. Wynikiem jest:
Mask: 00001111b
Value: 01010101b
Result: 00000101b
Maskowanie jest realizowany za pomocą I tak w C otrzymujemy:
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
Tutaj jest dość powszechne stosowanie-case: Wyodrębnianie poszczególnych bajtów z większego wyrazu. Bity wyższego rzędu definiujemy w słowie jako pierwszy bajt. Używamy do tego dwóch operatorów: &
i >>
(przesunięcie w prawo). W ten sposób możemy wyodrębnić cztery bajty z 32-bitowej liczby całkowitej:
void more_stuff(uint32_t value) { // Example value: 0x01020304
uint32_t byte1 = (value >> 24); // 0x01020304 >> 24 is 0x01 so
// no masking is necessary
uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so
// we must mask to get 0x02
uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so
// we must mask to get 0x03
uint32_t byte4 = value & 0xff; // here we only mask, no shifting
// is necessary
...
}
Uwaga, można zmienić kolejność operatorów powyżej, można najpierw zrobić maskę, a następnie przesunięcie. Wyniki są takie same, ale teraz musiałbyś użyć innej maski:
uint32_t byte3 = (value & 0xff00) >> 8;
Dobra odpowiedź, ale maskowanie można również zastosować do * ustawiania * lub * przełączania * określonych bitów za pomocą operacji OR lub XOR i odpowiedniej maski. –
@ user239558 dzięki za przykład i prawidłową składnię. @ Paul R. Czy po prostu powiem maskę i wartość w przykładzie podanym przez user239558 –
@ Mr.Z: w C, C++ i językach pokrewnych będziesz ** operatorem AND **, który jest zapisywany jako '&'. –
- 1. Co jest zero-width bitowe pole
- 2. Co to jest Serializable? Co to znaczy?
- 3. Co to jest "usuń to"?
- 4. Co to jest Pagel?
- 5. Co to jest _GLOBAL_OFFSET_TABLE?
- 6. Co to jest "android.R.layout.simple_list_item_1"?
- 7. Co to jest DetailsView.EnableModelValidation?
- 8. Co to jest NSPathStore2?
- 9. Co to jest czasownik = "*"?
- 10. Co to jest Postgresql_psycopg2?
- 11. Co to jest ?
- 12. co to jest .netrwhist?
- 13. co to jest Microsoft.Practices.EnterpriseLibrary.Data
- 14. Co to jest CGVector?
- 15. Co to jest $ {project.licensePath}?
- 16. co to jest alloc.h?
- 17. Co to jest PurpleEventCallback?
- 18. Co to jest global ::?
- 19. Co to jest? rodzaj?
- 20. Co to jest __meteor_bootstrap__?
- 21. Co to jest NuGetPackageImportStamp?
- 22. Co to jest LazyList?
- 23. Co to jest IllegalStateException?
- 24. Co to jest "loadall.so"?
- 25. Co to jest ws: //?
- 26. Co to jest DNVM?
- 27. Co to jest kthreadd_task
- 28. Co to jest AppDomain?
- 29. Co to jest klabject?
- 30. Co to jest UIViewController
Czy znasz operatory bitowe, takie jak & |^etc i logika Boole'a w ogóle? Wszelkie wyjaśnienia dotyczące operacji na maskach będą tego wymagały. –
Tak Mam rozumieć operatorów bitowych i logiki Boole'a –
Wiem, że łącza nie powinny być publikowane, ale wyjaśnienie wikipedii jest świetne: https://en.wikipedia.org/wiki/Mask_(computing) – pevik