Śpieszę z wyjaśnieniem (aczkolwiek nie wiem czy będę potrafił to przetłumaczyć na język ludzi)
- Iterujemy od 0 do 29 włącznie. Dla każdego przebiegu pętli przesuwamy bity o tyle ile wynosi
i
, następnie wykonujemy operację and
z argumentem 111b
, a wynik porównujemy do 101b
.
Przykład:
v = 1010001010b
i = 0
przesuwamy bity v o 0 w prawo => t = 1010001010b
wykonujemy operację and z argumentem 111b:
1010001010b
& 0000000111b
= 0000000010b
porównujemy wynik z 101b => 010b != 101b
i = 1
przesuwamy bity v o 1 w prawo => t = 0101000101b
wykonujemy operację and z argumentem 111b:
0101000101b
& 0000000111b
= 0000000101b
porównujemy wynik z 101b => 101b == 101b => zwiększamy licznik o 1.
i = 2
.... itd. aż i = 29
- Iterujemy od 0 do 3 włącznie. Dla każdego przebiegu pętli obliczamy wartość tymczasową (tj. bajt o numerze
i
-tym, a następnie połówki odwracamy). Potem scalamy wartość v
( w której zerujemy aktualny bajt ) z bajtem odwróconym przesuniętym w lewo o odpowiednią pozycję.
Przykład:
v = 0xABCDEF01 = 10101011 11001101 11101111 00000001b
i = 0
przesuwamy bity v o (i * 8) = 0 w prawo => temp = 10101011 11001101 11101111 00000001b
wykonujemy operację and z argumentem 0xff (11111111b):
10101011 11001101 11101111 00000001b
& 00000000 00000000 00000000 11111111b
= 00000000 00000000 00000000 00000001b
do temp wrzucamy wartość temp z przesuniętymi bitami w prawo o 4 oraz wartość temp z wykonaną operacją and z argumentem 0xF (1111b) i przesuniętymi bitami w lewo o 4, więc:
00000001b przesuwamy w prawo o 4 => 00000000b
00000001b & 1111b => 00000001b => przesuwamy w lewo o 4 => 00010000b
scalamy wyniki:
00000000b
| 00010000b
= 00010000b
teraz do v wrzucamy wartość v z wyzerowanym aktualnym bajtem i wartością obliczoną wyżej:
~(0xFF << i * 8) = wychodzi maska dzięki której możemy wyzerować aktualny bajt (11111111b przesuwamy w lewo o i*8 a następnie wynik negujemy).
v = v & maska | temp przesunięty w lewo o i*8
i tak z każdym i aż do 3 włącznie.