bitwise right shift
Főnév
bitwise right shift (tsz. bitwise right shifts)
Bitwise Right Shift (>>) C++-ban
A 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.
Jobbra tolás működése
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).
Példa jobbra tolásra (előjel nélküli számok)
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.
Példa jobbra tolásra (előjeles számok)
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á.
Logikai jobbra tolás (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;
}
Jobbra tolás és osztás kapcsolat
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.
Összegzés
- A
>>operátor minden bitet jobbra tol. - Előjel nélküli (
unsigned) számoknál mindig 0-val töltődik fel. - Előjeles (
signed) számoknál az eredmény attól függ, hogy arithmetikai vagy logikai shift történik-e. - Minden jobbra tolás (
>> 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.
- bitwise right shift - Szótár.net (en-hu)
- bitwise right shift - Sztaki (en-hu)
- bitwise right shift - Merriam–Webster
- bitwise right shift - Cambridge
- bitwise right shift - WordNet
- bitwise right shift - Яндекс (en-ru)
- bitwise right shift - Google (en-hu)
- bitwise right shift - Wikidata
- bitwise right shift - Wikipédia (angol)