Оператори Java побітове та зсувне (з прикладами)

У цьому підручнику ми дізнаємося про побітовий оператор та різні типи операторів зсуву в Java за допомогою прикладів.

У Java побітові оператори виконують операції з цілими даними на індивідуальному рівні бітів. Тут, ціле число дані включають в себе byte, short, intі longтипах даних.

Є 7 операторів, які виконують бітові операції в Java.

Оператор Опис
| Побітове АБО
& Побітове І
^ Побітовий XOR
~ Побітове доповнення
<< Лівий зсув
>> Підписано зрушення вправо
>>> Беззначний зрушення вправо

1. Побітове або оператор Java

Побітовий |оператор АБО повертає 1, якщо хоча б один з операндів дорівнює 1. В іншому випадку він повертає 0.

Наступна таблиця істинності демонструє роботу побітового оператора АБО. Нехай a і b - два операнди, які можуть приймати лише двійкові значення, тобто 1 або 0.

a b a | b
0 0 0
0 1 1
1 0 1
1 1 1

Наведена вище таблиця відома як "таблиця правди" для побітового оператора АБО.

Давайте розглянемо розрядні операції АБО двох цілих чисел 12 і 25.

 12 = 00001100 (In Binary) 25 = 00011001 (In Binary) Bitwise OR Operation of 12 and 25 00001100 | 00011001 ____________ 00011101 = 29 (In Decimal)

Приклад 1: Побітове АБО

 class Main ( public static void main(String() args) ( int number1 = 12, number2 = 25, result; // bitwise OR between 12 and 25 result = number1 | number2; System.out.println(result); // prints 29 ) )

2. Побітове та оператор Java

Побітовий &оператор AND повертає 1 тоді і тільки тоді, коли обидва операнди дорівнюють 1. В іншому випадку він повертає 0.

Наступна таблиця демонструє роботу побітового оператора І. Нехай a і b - два операнди, які можуть приймати лише двійкові значення, тобто 1 і 0.

a b a & b
0 0 0
0 1 0
1 0 0
1 1 1

Давайте подивимося на побітове операцію І двох цілих чисел 12 і 25.

 12 = 00001100 (In Binary) 25 = 00011001 (In Binary) // Bitwise AND Operation of 12 and 25 00001100 & 00011001 ____________ 00001000 = 8 (In Decimal)

Приклад 2: Побітове І

  class Main ( public static void main(String() args) ( int number1 = 12, number2 = 25, result; // bitwise AND between 12 and 25 result = number1 & number2; System.out.println(result); // prints 8 ) )

3. Оператор Java побітового XOR

Побітовий ^оператор XOR повертає 1 тоді і тільки тоді, коли один з операндів дорівнює 1. Однак, якщо обидва операнди дорівнюють 0 або якщо обидва дорівнюють 1, то результат дорівнює 0.

Наступна таблиця істинності демонструє роботу побітового оператора XOR. Нехай a і b - два операнди, які можуть приймати лише двійкові значення, тобто 1 або 0.

a b a & b
0 0 0
0 1 1
1 0 1
1 1 0

Давайте розглянемо побітову операцію XOR двох цілих чисел 12 і 25.

 12 = 00001100 (In Binary) 25 = 00011001 (In Binary) // Bitwise XOR Operation of 12 and 25 00001100 00011001 ____________ 00010101 = 21 (In Decimal)

Приклад 4: Побітове XOR

 class Main ( public static void main(String() args) ( int number1 = 12, number2 = 25, result; // bitwise XOR between 12 and 25 result = number1 number2; System.out.println(result); // prints 21 ) )

4. Оператор бітового доповнення Java

Побітовий оператор доповнення - це унарний оператор (працює лише з одним операндом). Він позначається ~.

Він змінює двійкові цифри від 1 до 0 та від 0 до 1 .

Оператор бітового доповнення Java

It is important to note that the bitwise complement of any integer N is equal to - (N + 1). For example,

Consider an integer 35. As per the rule, the bitwise complement of 35 should be -(35 + 1) = -36. Now let's see if we get the correct answer or not.

 35 = 00100011 (In Binary) // using bitwise complement operator ~ 00100011 __________ 11011100

In the above example, we get that the bitwise complement of 00100011 (35) is 11011100. Here, if we convert the result into decimal we get 220.

However, it is important to note that we cannot directly convert the result into decimal and get the desired output. This is because the binary result 11011100 is also equivalent to -36.

To understand this we first need to calculate the binary output of -36.

2's Complement

In binary arithmetic, we can calculate the binary negative of an integer using 2's complement.

1's complement changes 0 to 1 and 1 to 0. And, if we add 1 to the result of the 1's complement, we get the 2's complement of the original number. For example,

 // compute the 2's complement of 36 36 = 00100100 (In Binary) 1's complement = 11011011 2's complement: 11011011 + 1 _________ 11011100

Тут ми бачимо, що доповнення 36 до числа 2 (тобто -36 ) - це 11011100 . Це значення еквівалентно розрядному доповненню 35 .

Отже, ми можемо сказати, що побітове доповнення 35 дорівнює - (35 + 1) = -36 .

Приклад 3: Побітове доповнення

 class Main ( public static void main(String() args) ( int number = 35, result; // bitwise complement of 35 result = ~number; System.out.println(result); // prints -36 ) )

Оператори Java Shift

У Java існує три типи операторів зсуву:

  • Підписаний лівий зсув (<<)
  • Підписано вправо Shift (>>)
  • Непідписаний правий зсув (>>>)

5. Оператор лівого зсуву Java

Лівий оператор зсуву зміщує всі біти вліво на певну кількість заданих бітів. Він позначається <<.

Java 1 бітний лівий оператор зсуву

As we can see from the image above, we have a 4-digit number. When we perform a 1 bit left shift operation on it, each individual bit is shifted to the left by 1 bit.

As a result, the left-most bit (most-significant) is discarded and the right-most position(least-significant) remains vacant. This vacancy is filled with 0s.

Example 5: Left Shift Operators

 class Main ( public static void main(String() args) ( int number = 2; // 2 bit left shift operation int result = number << 2; System.out.println(result); // prints 8 ) )

5. Java Signed Right Shift Operator

The signed right shift operator shifts all bits towards the right by a certain number of specified bits. It is denoted by >>.

When we shift any number to the right, the least significant bits (rightmost) are discarded and the most significant position (leftmost) is filled with the sign bit. For example,

 // right shift of 8 8 = 1000 (In Binary) // perform 2 bit right shift 8>> 2: 1000>> 2 = 0010 (equivalent to 2)

Тут ми виконуємо правильний зсув 8 (тобто знак позитивний). Отже, знакового біта немає. Отже, крайні ліві біти заповнені 0 (представляє позитивний знак).

 // right shift of -8 8 = 1000 (In Binary) 1's complement = 0111 2's complement: 0111 + 1 _______ 1000 Signed bit = 1 // perform 2 bit right shift 8>> 2: 1000>> 2 = 1110 (equivalent to -2)

Тут ми використали підписаний біт 1 для заповнення крайніх лівих бітів.

Приклад 6: Підписаний правий оператор зсуву

 class Main ( public static void main(String() args) ( int number1 = 8; int number2 = -8; // 2 bit signed right shift System.out.println(number1>> 2); // prints 2 System.out.println(number2>> 2); // prints -2 ) )

7. Безпідписаний оператор зсуву Java

Java також забезпечує беззнаковий зрушення вправо. Він позначається >>>.

Тут вакантне ліве місце заповнюється 0 замість знакового біта. Наприклад,

 // unsigned right shift of 8 8 = 1000 8>>> 2 = 0010 // unsigned right shift of -8 -8 = 1000 (see calculation above) -8>>> 2 = 0010

Приклад 7: Беззнаковий зрушення вправо

 class Main ( public static void main(String() args) ( int number1 = 8; int number2 = -8; // 2 bit signed right shift System.out.println(number1>>> 2); // prints 2 System.out.println(number2>>> 2); // prints 1073741822 ) )

Як ми можемо бачити, підписаний та беззнаковий правий оператор зсуву повертає різні результати для від’ємних бітів. Щоб дізнатись більше, відвідайте Різницю між >> і >>>.

Цікаві статті...