Dobrze, że podałeś deklarację typu w C/C++, ale przydałoby się też wiedzieć jak ten typ masz zadeklarowany w Delphi. No to może zróbmy inaczej, bo widzę, że nie możemy się dogadać.
Dla przykładu, mamy zbiorczy bufor o rozmiarze 32 bitów. Nieważne jakim typem sobie go reprezentujesz – ważne, aby dało się go potraktować jako liczbę 32-bitową. Wzór na zapalenie konkretnego bitu poniżej:
Buffer := (Value shl BitPos) or Buffer;
Gdzie Buffer
to nasz zbiorczy bufor (liczba 32-bitowa), Value
to wartość, jaką chcemy wrzucić do bufora, a BitPos
to numer bitu w buforze (najmłodszego dla wrzucanej wartości). Pamiętaj, że mowa o indeksowaniu bitów od 0
.
Przykład zapalenia szóstego bitu (o indeksie 5
):
var
Buffer: UInt32 = 0;
Value: UInt32 = 1;
begin
Buffer := (Value shl 5) or Buffer;
Po konwersji na liczbę binarną, dostaniemy poniższe:
0b00000000000000000000000000100000
Szósty bit jak widać zapalił się. Teraz wrzucimy sobie dwubitową wartość do pustego bufora:
var
Buffer: UInt32 = 0;
Value: UInt32 = 3;
begin
Buffer := (Value shl 5) or Buffer;
W rezultacie dostaniemy poniższe:
0b00000000000000000000000001100000
Jak widać wartość została wrzucona w miejsce szóstego bitu, ale że zajmuje dwa bity, to zapaliliśmy bit szósty i siódmy. Rozumiesz jak to działa?