Lewy Shift(<<)
Jest to operator binarny, który pobiera dwie liczby, w lewo przesuwa bity pierwszego operandu, a drugi operand decyduje o liczbie miejsc do przesunięcia. Innymi słowy, przesunięcie liczby całkowitej w lewo A z liczbą całkowitą B oznaczone jako „ (a< jest równoznaczne z pomnożeniem A z 2^b (2 podniesione do potęgi b).
Składnia:
a << b;>
- a: Pierwszy argument b: Drugi argument
Przykład: Weźmy a=5 ; który jest 101 w formie binarnej. Teraz jeśli a jest przesunięte w lewo o 2 tj a=a<<2 Następnie A stanie się a=a*(2^2) . Zatem, a=5*(2^2)=20 co można zapisać 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;> }> |
>
Java int jako ciąg
>
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;> }> |
>
>Wyjście
a<<1 = 10 b<<1 = 18>
Prawy Shift(>>)
Jest to operator binarny, który pobiera dwie liczby, przesuwa w prawo bity pierwszego operandu, a drugi operand decyduje o liczbie miejsc do przesunięcia. Innymi słowy, przesunięcie liczby całkowitej w prawo A z liczbą całkowitą B oznaczone jako „ (a>>b) ' jest równoznaczne z podzieleniem a przez 2^b.
Składnia:
a>>b;>
- a: Pierwszy argument b: Drugi argument
Przykład: Weźmy a=5 ; który jest 101 w formie binarnej. Teraz jeśli a jest przesunięte w prawo o 2 tj. a=a>>2 Następnie A stanie się a=a/(2^2) . Zatem, a=a/(2^2)=1 co można zapisać 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;> }> |
>
>Wyjście
a>>1 = 2 b>>1 = 4>
Ważne punkty
1. Operatorów przesunięcia w lewo i w prawo nie należy używać w przypadku liczb ujemnych. Wynikiem jest niezdefiniowane zachowanie, jeśli którykolwiek z operandów jest liczbą ujemną. Na przykład wyniki zarówno 1>> -1, jak i 1 << -1 są niezdefiniowane.
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;> }> |
>
>Wyjście
2 <>-5 = 64>
2. Jeśli liczba zostanie przesunięta o więcej niż wielkość liczby całkowitej, zachowanie jest niezdefiniowane. Na przykład 1 << 33 jest niezdefiniowane, jeśli liczby całkowite są przechowywane przy użyciu 32 bitów. Dla przesunięcia bitowego większych wartości 1ULL<<62 ULL jest używany dla Unsigned Long Long, który jest zdefiniowany przy użyciu 64 bitów, które mogą przechowywać duże wartości.
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;> }> |
iterator Java mapy
>
>Wyjście
3 << 65 = 0>
3. Przesunięcie w lewo o 1 i przesunięcie w prawo o 1 są równoważne odpowiednio iloczynowi pierwszego członu i 2 odpowiednio mocy danego elementu (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;> }> |
>
>Wyjście
2^5 using pow() function: 32 2^5 using left shift: 32>
Musisz przeczytać: Operatory bitowe w C/C++