Kotlin предоставляет несколько функций (в инфиксной форме) для выполнения побитовых операций и операций сдвига. В этой статье вы научитесь выполнять операции битового уровня в 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?
Это потому, что компилятор показывает двойное дополнение этого числа; отрицательная запись двоичного числа.
For any integer n, 2's complement of n will be -(n+1)
.
Decimal Binary 2's complement --------- --------- --------------------------------------- 0 00000000 -(11111111+1) = -00000000 = -0(decimal) 1 00000001 -(11111110+1) = -11111111 = -256(decimal) 12 00001100 -(11110011+1) = -11110100 = -244(decimal) 220 11011100 -(00100011+1) = -00100100 = -36(decimal) Note: Overflow is ignored while computing 2's complement.
The bitwise complement of 35 is 220 (in decimal). The 2's complement of 220 is -36. Hence, the output is -36 instead of 220.
5. shl
The shl
function shifts bit pattern to the left by certain number of specified bits, and zero bits are shifted into the low-order positions.
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 в дополнение 2147483645
есть 3
.