Operátory levý Shift a pravý Shift v C/C++
Levý Shift ( < <)
Je to binární operátor, který vezme dvě čísla, doleva posouvá bity prvního operandu a druhý operand rozhoduje o počtu míst, která se mají posunout. Jinými slovy, posun celého čísla doleva A s celým číslem b označeno jako ‚ (a < je ekvivalentní násobení A s 2^b (2 zvednuté na moc b).
Syntax:
a < < b;
- a: První operand b: Druhý operand
Příklad: Pojďme vzít a=5 ; který je 101 v binární formě. Teď když a je posunuto o 2 doleva tj a=a <2 pak A bude a=a*(2^2) . Tím pádem, a=5*(2^2)=20 které lze napsat jako 10100.
C
// C Program to demonstrate use> // of left shift operator> #include> // Driver code> int> main()> {> > // a = 5(00000101), b = 9(00001001)> > unsigned> char> a = 5, b = 9;> > // The result is 00001010> > printf> (> 'a < <1 = %d
'> , (a < < 1));> > // The result is 00010010> > printf> (> 'b < <1 = %d'> , (b < < 1));> > return> 0;> }> |
C++
// C++ Program to demonstrate use> // of left shift operator> #include> using> namespace> std;> // Driver code> int> main()> {> > // a = 5(00000101), b = 9(00001001)> > unsigned> char> a = 5, b = 9;> > // The result is 00001010> > cout < <> 'a < <1 = '> < < (a < < 1) < < endl;> > // The result is 00010010> > cout < <> 'b < <1 = '> < < (b < < 1) < < endl;> > return> 0;> }> |
Výstup
a < <1 = 10 b < <1 = 18
Pravý Shift(>>)
Je to binární operátor, který vezme dvě čísla, doprava posouvá bity prvního operandu a druhý operand rozhoduje o počtu míst, která se mají posunout. Jinými slovy, posun celého čísla doprava A s celým číslem b označeno jako ‚ (a>>b) ‘ je ekvivalentní dělení a 2^b.
Syntax:
a>> b;
- a: První operand b: Druhý operand
Příklad: Pojďme vzít a=5 ; který je 101 v binární formě. Teď když a je posunuto doprava o 2 tj. a=a>>2 pak A bude a=a/(2^2) . Tím pádem, a=a/(2^2)=1 které lze napsat jako 01 .
C
// C Program to demonstrate> // use of right-shift operator> #include> // Driver code> int> main()> {> > // a = 5(00000101), b = 9(00001001)> > unsigned> char> a = 5, b = 9;> > // The result is 00000010> > printf> (> 'a>>1 = %d
'> , (a>> 1));> > // The result is 00000100> > printf> (> 'b>>1 = %d'> , (b>> 1));> > return> 0;> }> |
C++
// C++ Program to demonstrate> // use of right-shift operator> #include> using> namespace> std;> // Driver code> int> main()> {> > // a = 5(00000101), b = 9(00001001)> > unsigned> char> a = 5, b = 9;> > // The result is 00000010> > cout < <> 'a>>1 = '> <>1) < < endl;> > // The result is 00000100> > cout < <> 'b>>1 = '> <>1) < < endl;> > return> 0;> }> |
Výstup
a>>1 = 2 b>>1 = 4
Důležité body
1. Operátory levého a pravého posunu by se neměly používat pro záporná čísla. Výsledkem je nedefinované chování, pokud je některý z operandů záporné číslo. Například výsledky 1>> -1 a 1 < < -1 nejsou definovány.
C
// C program to show behaviour of shift operators for> // negative values> #include> int> main()> {> > // left shift for negative value> > printf> (> '2 < < -5 = %d
'> , (2 < < -5));> > // right shift for negative value> > printf> (> '2>> -5 = %d'> , (2>> -5));> > return> 0;> }> |
C++
// C++ program to show behaviour of shift operators for> // negative values> #include> using> namespace> std;> int> main()> {> > // left shift for negative value> > cout < <> '2 < < -5 = '> < < (2 < < -5) < < endl;> > // right shift for negative value> > cout < <> '2>> -5 = '> <>-5) < < endl;> > return> 0;> }> |
Výstup
2 <>-5 = 64
2. Pokud je číslo posunuto více než je velikost celého čísla, chování není definováno. Například 1 < < 33 není definováno, pokud jsou celá čísla uložena pomocí 32 bitů. Pro bitový posun větších hodnot 1ULL < <62 ULL se používá pro Unsigned Long Long, který je definován pomocí 64 bitů, které mohou ukládat velké hodnoty.
C
// c program to demonstrate the behaviour of bitwise> // shift operators for large values> #include> int> main()> {> > int> N = 3;> > // left shift of 65 digits> > printf> (> '3 < < 65 = %d'> , (3 < < 65));> > return> 0;> }> |
C++
// c++ program to demonstrate the behaviour of bitwise> // shift operators for large values> #include> using> namespace> std;> int> main()> {> > int> N = 3;> > // left shift by 65 digits> > cout < <> '3 < < 65'> < < (3 < < 65) < < endl;> > return> 0;> }> |
Výstup
3 < < 65 = 0
3. Levý posun o 1 a pravý posun o 1 jsou ekvivalentní součinu prvního členu a 2 mocnině daného prvku (1 <>3 = 1/pow(2,3)).
C
// C program for the above approach> #include> #include> int> main()> {> > printf> (> '2^5 using pow() function: %.0f
'> ,> pow> (2, 5));> > printf> (> '2^5 using left shift: %d
'> , (1 < < 5));> > return> 0;> }> // This code is contributed Prince Kumar> |
C++
// C++ program to get the shifted values using pow()> #include> #include> using> namespace> std;> int> main()> {> > cout < <> '2^5 using pow() function'> < <> pow> (2, 5) < < endl;> > cout < <> '2^5 using leftshift'> < < (1 < < 5) < < endl;> > return> 0;> }> |
Výstup
2^5 using pow() function: 32 2^5 using left shift: 32
Musíš číst: Bitové operátory v C/C++