Операції Котліна за побітовими та бітшифтними змінами (з прикладами)

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

Побітові оператори та оператори зсуву бітів використовуються лише для двох інтегральних типів ( Intі Long) для виконання операцій бітового рівня.

Для виконання цих операцій Kotlin надає 7 функцій із використанням інфіксної нотації.

1. або

orФункція порівнює відповідні біти двох значень. Якщо будь-який з бітів дорівнює 1, це дає 1. Якщо ні, то дає 0. Наприклад,

 12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Побітове АБО Операція 12 та 25 00001100 або 00011001 ________ 00011101 = 29 (у десятковому)

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

 fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )

Коли ви запускаєте програму, результат буде:

 29

2. і

andФункція порівнює відповідні біти двох значень. Якщо обидва біти дорівнюють 1, це оцінюється як 1. Якщо будь-який з бітів дорівнює 0, він оцінюється як 0. Наприклад,

 12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Бітова операція 12 та 25 00001100 та 00011001 ________ 00001000 = 8 (у десятковому)

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

 fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )

Коли ви запускаєте програму, результат буде:

 8

3. xor

xorФункція порівнює відповідні біти двох значень. Якщо відповідні біти різні, це дає 1. Якщо відповідні біти однакові, це дає 0. Наприклад,

 12 = 00001100 (у двійковому) 25 = 00011001 (у двійковому) Побітове АБО Операція 12 та 25 00001100 xor 00011001 ________ 00010101 = 21 (у десятковому)

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

 fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )

Коли ви запускаєте програму, результат буде:

 21

4. inv ()

Функція inv () інвертує бітовий шаблон. Він робить кожні 0 до 1 і кожні 1 до 0.

 35 = 00100011 (у двійковому) Побітове доповнення Операція 35 00100011 ________ 11011100 = 220 (у десятковому)

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

 fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )

Коли ви запускаєте програму, результат буде:

 -36

Чому ми отримуємо результат -36 замість 220?

Це тому, що компілятор показує доповнення 2 до цього числа; від’ємне позначення двійкового числа.

Для будь-якого цілого числа n доповненням n буде 2 -(n+1).

 Десятичний двійковий додаток 2 --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (десятковий) 1 00000001 - (11111110 + 1) = -11111111 = -256 (десятковий) 12 00001100 - (11110011 +1) = -11110100 = -244 (десятковий) 220 11011100 - (00100011 + 1) = -00100100 = -36 (десятковий) Примітка: Переповнення ігнорується під час обчислення доповнення 2.

Побітове доповнення 35 дорівнює 220 (у десяткових). Додаток 2 із 220 - -36. Отже, результат дорівнює -36 замість 220.

5. шл

Ці shlфункціональні зрушення бітової комбінації зліва від деякого числа заданих бітів, і нульові біти зсуваються в позиції низького порядку.

 212 (In binary: 11010100) 212 shl 1 evaluates to 424 (In binary: 110101000) 212 shl 0 evaluates to 212 (In binary: 11010100) 212 shl 4 evaluates to 3392 (In binary: 110101000000)

Example: Bitwise left shift

 fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )

When you run the program, the output will be:

 424 212 3392

6. shr

The shr function shifts bit pattery to the right by certin number of specified bits.

 212 (In binary: 11010100) 212 shr 1 evaluates to 106 (In binary: 01101010) 212 shr 0 evaluates to 212 (In binary: 11010100) 212 shr 8 evaluates to 0 (In binary: 00000000)

If the number is a 2's complement signed number, the sign bit is shifted into the high-order positions.

 fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )

When you run the program, the ouput will be:

 106 212 0

7. ushr

The ushr function shifts zero into the leftmost position.

Example: signed and unsigned Right Shift

 fun main(args: Array) ( val number1 = 5 val number2 = -5 // Signed right shift println(number1 shr 1) // Unsigned right shift println(number1 ushr 1) // Signed right shift println(number2 shr 1) // Unsigned right shift println(number2 ushr 1) )

When you run the program, the output will be:

 2 2 -3 2147483645

Зверніть увагу на те, як функція підписаного та безпідрядного зрушення працює по-різному для доповнення 2.

Доповнення 2 до 2147483645є 3.

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