bitwise left shift (tsz. bitwise left shifts)
<<
) C++-banA bitwise left shift (<<
) operátor egy szám bináris ábrázolását balra tolja a megadott számú bittel. Ez a művelet minden bitet balra tol, és a jobb oldali üres helyeket nullákkal tölti fel.
<<
) működéseA <<
operátor lényege: - Minden bit balra tolódik a megadott számú pozícióval. - A jobb oldali üres helyek mindig nullákkal töltődnek fel. - A bal oldalon lévő bitek elveszhetnek, ha azok túllépik a tárolható bitszámot (overflow veszély!). - Matematikailag a balra tolás egyenértékű egy hatványozott szorzással (2^n
-nel szorozza a számot).
Ha egy számot balra tolunk egy bittel (<< 1
), az azt jelenti, hogy megduplázzuk.
#include <iostream>
int main() {
int a = 5; // 0101 binárisan
int b = a << 1; // Egy bittel balra tolás
std::cout << b << std::endl; // Kiírja: 10
return 0;
}
Művelet lebontása:
00000101 (5 decimálisan) << 1 ----------------- 00001010 (10 decimálisan)
Minden bit balra tolódik, és a jobb oldali üres helyek 0-val töltődnek fel.
int c = 5 << 2; // 5 * 2^2 = 20 lesz az eredmény
00000101 (5) << 2 ----------------- 00010100 (20)
Minden bit két helyet balra mozog, az eredmény meg-négyszereződik.
A balra tolás (<<
) matematikailag egy hatványozott szorzás: - x << 1
ugyanaz, mint x * 2
- x << 2
ugyanaz, mint x * 4
- x << n
ugyanaz, mint x * (2^n)
Példák:
int a = 3 << 1; // 3 * 2 = 6
int b = 3 << 2; // 3 * 4 = 12
int c = 3 << 3; // 3 * 8 = 24
Ezért a <<
operátor gyakran gyorsabb, mint a szorzás (*
), mert a legtöbb CPU gyorsabban tudja eltolni a biteket, mint szorozni.
A balra tolás veszélyes lehet, ha a szám túl nagy, és a legfelső bit kilép a hatókörből.
#include <iostream>
#include <climits>
int main() {
int a = 1073741824; // 2^30
int b = a << 1; // Túllépés történik (overflow)
std::cout << b << std::endl; // Az eredmény meglepő lehet!
return 0;
}
Ha egy 32 bites egész számon dolgozunk, a balra tolás a legfelső bitet elveszítheti, és hibás eredményeket kaphatunk.
unsigned
) típustunsigned int a = 1073741824; // 2^30
unsigned int b = a << 1; // Még mindig érvényes számítás
Gyors szorzás: x << n
gyorsabb, mint x * (2^n)
.
Bitmaskok létrehozása: Egy adott bit bekapcsolásához.
int mask = 1 << 3; // A 3. bit bekapcsolása: 00001000
Alacsony szintű programozás: Hardvervezérléshez, memóriacímzéshez.
<<
) minden bitet balra tol, a jobb oldalt nullákkal tölti fel.2^n
-szeres szorzással egyenértékű.unsigned
) típusok esetén biztonságosabb.overflow
), az eredmény hibás lehet.Ezt a műveletet gyakran használjuk optimalizálásra, bitmaskokra és hardverprogramozásra!