Powiedz, że mam taki bajt 1010XXXX, gdzie wartości X mogą być dowolne. Chcę ustawić cztery dolne bity do określonego wzorca, na przykład 1100, pozostawiając cztery górne bity niezmienione. Jak zrobić to najszybciej w C?Jak ustawić tylko niektóre bity bajta w C bez wpływu na resztę?
13
A
Odpowiedz
11
Wszystkie te bity można ustawić na 0 bitowo-operacyjnie, z 4 bitami ustawionymi na 0 i wszystkimi innymi ustawionymi na 1 (Jest to dopełnienie 4 bitów ustawionych na 1). Możesz wtedy bitowe - lub w bitach, jak normalnie.
tj
val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no
// other bits are set.
33
Ogólnie:
value = (value & ~mask) | (newvalue & mask);
mask
jest wartością ze wszystkich bitów zostać zmienione (i tylko oni) ustawiony na 1 - byłoby 0xf w Twoim przypadku. newvalue
to wartość zawierająca nowy stan tych bitów - wszystkie pozostałe bity są w zasadzie ignorowane.
Będzie to działać dla wszystkich typów, dla których obsługiwane są operatory bitowe.
0
Użyj operatora bitowego lub | gdy chcesz zmienić trochę bajt od 0 do 1.
operatora Zastosowanie mnożenie i & gdy chcemy zmienić trochę bajt od 1 do 0
Przykład
#include <stdio.h>
int byte;
int chb;
int main() {
// Change bit 2 of byte from 0 to 1
byte = 0b10101010;
chb = 0b00000100; //0 to 1 changer byte
printf("%d\n",byte); // display current status of byte
byte = byte | chb; // perform 0 to 1 single bit changing operation
printf("%d\n",byte);
// Change bit 2 of byte back from 1 to 0
chb = 0b11111011; //1 to 0 changer byte
byte = byte & chb; // perform 1 to 0 single bit changing operation
printf("%d\n",byte);
}
Może są lepsze sposoby, nie wiem. To ci pomoże na teraz.
Powiązane problemy
- 1. Jak ustawić wygląd UIButton bez wpływu na elementy UIBarButtonItems?
- 2. Jak zmienić elementy ArrayList w duplikacie bez wpływu na oryginalny?
- 3. Jak znaleźć resztę podziału w C?
- 4. Zezwalaj tylko na jednego użytkownika-agenta, zablokuj resztę w nginx?
- 5. Czytanie bajta w określonej pozycji pliku w C++
- 6. Jak przesłonić zmienną w podklasie Ruby bez wpływu na nadklasę?
- 7. Jak mogę uzyskać/ustawić poszczególne bity w float?
- 8. Lewe bity zmiany w c
- 9. Używanie Notepad ++ jako edytora Git bez wpływu na ustawienia
- 10. Jak zresetować COMP_WORDBREAKS bez wpływu na inny skrypt zakończenia?
- 11. Jak zmienić definicję wyliczenia bez wpływu na klientów używających go w C#
- 12. Rozmiar bajta w pamięci - Java
- 13. Zmień datę systemową w kontenerach docker bez wpływu na hosta
- 14. Słowo VSTO 2016: Squiggly podkreślenie bez wpływu na cofanie
- 15. kontrola ggplot2 legenda wygląd bez wpływu na fabułę
- 16. Rozszerzanie protokołu udostępnianego przez bibliotekę bez wpływu na innych użytkowników.
- 17. Obliczanie parzystości bajta w Rubim
- 18. Filtrowanie WSDL na tylko niektóre operacje
- 19. Sprawdź upływie biletów uwierzytelniania bez wpływu na to
- 20. moment.js dodać/odjąć dni bez wpływu na pierwotną datę
- 21. Anuluj trasę za pomocą Sammy.js bez wpływu na historię
- 22. Jak ustawić układ krajobrazu tylko na tablety?
- 23. Jak osadzić tylko niektóre linie z istoty?
- 24. Jak podzielić łańcuch na wiele ograniczników, ale przechwytuje tylko niektóre?
- 25. Jak ponownie wyświetlić tylko niektóre obiekty w Sunspot Solr
- 26. sprawdzanie poprawności zagnieżdżonych formularzy bez wpływu na formularz rodzica
- 27. Jak mogę przekonwertować bity na bajty?
- 28. Guice wstrzykuje tylko niektóre konstruktory
- 29. połowowe tylko niektóre błędy runtime w Pythonie
- 30. Jak odwrócić bity bajtu?
Czy możesz podać konkretny przykład? Załóżmy, że mam: n = 1024. Chcę zmienić bity z pozycji 3 na 7 (włącznie, zaczynając od 0 z najmniej znaczącym bitem) na k = 19. Wynik powinien wynosić: 1176. Jak mogę to osiągnąć? Dziękuję Ci. – dh16