Kotlin побитовые операции и битовые сдвиги (с примерами)

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.

Интересные статьи...