Co robi podana instrukcja - (i&(1<<x)

0

Witam, szybkie pytanie, co robi instrukcja if(i&(1<<x)? Czy to przesuwa jedynkę bitowo w lewo o 1 miejsce?

4

Sprawdza czy w liczbie i zapalony jest bit nr x.
Narysuj sobie to na kartce, a zrozumiesz :-P

3

i & (1 << x) – można to zobrazować w ten sposób (przykład dla 8-bitowej liczby):

x = 2         
i = 172 (10101100)

00000001 << 2        == 00000100
10101100 &  00000100 == 00000100 (wynik)

Wynik jest różny od 0, więc warunek zostanie spełniony. Inny przykład:

x = 4
i = 172 (10101100)

00000001 << 4        == 00010000
10101100 &  00010000 == 00000000 (wynik)

Piąty bit jest zgaszony, dzięki czemu wynikiem jest 0 – warunek nie zostanie spełniony.


Sprawdzenie czy konkretny bit jest zapalony, można przeprowadzić inaczej – (i >> x) & 1:

x = 2
i = 172 (10101100)

10101100 >> 2        == 00101011
00101011 &  00000001 == 00000001 (wynik)

Wynikiem jest 1, więc warunek zostanie spełniony. I odpowiednik drugiego przykładu:

x = 4
i = 172 (10101100)

10101100 >> 4        == 00001010
00001010 &  00000001 == 00000000 (wynik)

Wynikiem jest 0, warunek nie zostanie spełniony.


Różnica pomiędzy tymi dwoma wzorami jest taka:

  • i & (1 << x):
    • wynik jest równy 0 gdy dany bit jest zgaszony,
    • wynik jest różny od 0 gdy bit jest zapalony.
  • (i >> x) & 1:
    • wynik jest równy 0 gdy dany bit jest zgaszony,
    • wynik jest równy 1 gdy dany bit jest zapalony.

Co prawa oba sposoby pozwalają sprawdzić czy bit jest zapalony, jednak dają różne wyniki, więc ich przeznaczenie jest różne. Wynik tego drugiego można bezpośrednio wykorzystać np. do mnożenia:

int index = ((i >> x) & 1) * 5;

Zmienna index będzie posiadać wartość 0 lub 5. Bardzo przydatne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1