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
.