bitwise right shift (tsz. bitwise right shifts)
>>
) C++-banA bitwise right shift (>>
) operátor a szám bináris ábrázolását jobbra tolja a megadott számú bittel. Ez a művelet minden bitet eltol egy adott irányba, és attól függően, hogy az operandus előjeles vagy előjel nélküli, a bal oldali biteket nullákkal vagy az eredeti előjellel tölti fel.
A jobbra tolás (>>
) alapelve: - Minden bit jobbra mozog. - A bal oldalon lévő bitek attól függően töltődnek ki, hogy az operandus előjeles vagy előjel nélküli: - Előjel nélküli (unsigned
) számoknál: mindig 0-val töltődik fel. - Előjeles (signed
) számoknál: a legtöbb fordítóban az előjelbit alapján történik a kitöltés (arithmetikai shift vagy logikai shift).
Ha egy számot jobbra tolunk egy bittel (>> 1
), az azt jelenti, hogy felezzük.
#include <iostream>
int main() {
unsigned int a = 8; // 1000 binárisan
unsigned int b = a >> 1; // Egy bittel jobbra tolás
std::cout << b << std::endl; // Kiírja: 4
return 0;
}
Művelet lebontása:
1000 (8 decimálisan) >> 1 -------------- 0100 (4 decimálisan)
Minden bit jobbra tolódik, és a bal oldali üres helyek 0-val töltődnek fel.
Előjeles számok esetén az eredmény attól függ, hogy arithmetikai vagy logikai shift történik.
#include <iostream>
int main() {
int a = -8; // -8 binárisan kétkomplementes formában (például 32 biten: 11111111 11111111 11111111 11111000)
int b = a >> 1; // Egy bittel jobbra tolás
std::cout << b << std::endl; // Általában -4 lesz az eredmény
return 0;
}
Ha a fordító arithmetikai shiftet alkalmaz (ami a legtöbb esetben igaz), akkor:
11111111 11111111 11111111 11111000 (-8 kétkomplementes ábrázolás) >> 1 ------------------------------------------------ 11111111 11111111 11111111 11111100 (-4 decimálisan)
Fontos!
- Az előjelbit (az első bit) megmaradhat, ha arithmetikai shift történik. - Ha logikai shiftet akarunk előjeles számokkal, akkor először alakítsuk őket unsigned int típusúvá.
unsigned
típus)Ha logikai jobbra tolást akarunk végezni egy előjeles számon, akkor átalakíthatjuk előjel nélkülivé:
#include <iostream>
int main() {
int a = -8;
unsigned int b = static_cast<unsigned int>(a) >> 1;
std::cout << b << std::endl; // Logikai shiftet végez
return 0;
}
Egy jobbra tolás egy bittel (x >> 1
) matematikailag megfelel x / 2
-nek, de kerekítési hibák lehetnek.
Példák:
int a = 10 >> 1; // 10 / 2 = 5
int b = 9 >> 1; // 9 / 2 = 4 (nem 4.5, mert egész osztás)
Figyelem!
Negatív számok esetén a >>
osztásként való használata kerekítési problémákhoz vezethet, mert az osztás és az arithmetikai shift eltérően kerekíthet.
>>
operátor minden bitet jobbra tol.unsigned
) számoknál mindig 0-val töltődik fel.signed
) számoknál az eredmény attól függ, hogy arithmetikai vagy logikai shift történik-e.>> 1
) a számot felezi.Ezt a műveletet gyakran használják bitműveleti optimalizálásra, hatékony számításokra, és hardverprogramozásra.