English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Operaciones de nivel de bits y desplazamiento en Kotlin

Kotlin proporciona varias funciones (en forma infix) para ejecutar operaciones de nivel de bits y desplazamiento. En este artículo, aprenderás a realizar operaciones a nivel de bits en Kotlin con ejemplos.

Se utilizan operadores de nivel de bits y operadores de desplazamiento solo en dos tipos de enteros (Int y Long) para ejecutar operaciones a nivel de bits.

Para ejecutar estas operaciones, Kotlin proporciona7Se utiliza un símbolo infixo.

Operación lógica OR (or)

La función or compara los bits correspondientes de dos valores. Si uno de los bits es1entonces es1. De lo contrario, es 0. Por ejemplo,

12 = 00001100 (binario)
25 = 00011001 (binario)
12y25Operación lógica OR bit a bit
   00001100 or
   00011001
   ________
   00011101  = 29 (decimal)

Ejemplo: Operación lógica OR

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    val result: Int
    result = number1 or number2   // result = number1.or(number2)
    println(result)
}

Al ejecutar el programa, la salida será:

29

AND lógico

La función and compara los bits correspondientes de dos valores. Si ambos bits son1el valor es1Si uno de los dos bits es 0, el valor es 0. Por ejemplo,

12 = 00001100 (binario)
25 = 00011001 (binario)
12y25的按位与运算
   00001100 and
   00011001
   ________
   00001000  = 8 (decimal)

示例:按位与运算

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    val result: Int
    result = number1 and number2   // result = number1.and(number2)
    println(result)
}

Al ejecutar el programa, la salida será:

8

按位异或(xor)

xor函数比较两个值的相应位。如果相应的位不同,则为1. Si los bits correspondientes son iguales, es 0. Por ejemplo,

12 = 00001100 (binario)
25 = 00011001 (binario)
12y25la operación xor bit a bit
   00001100 xor
   00011001
   ________
   00010101  = 21 (decimal)

Ejemplo: operación de xor bit a bit

fun main(args: Array<String>) {
    val number1 = 12
    val number2 = 25
    val result: Int
    result = number1 xor number2   // result = number1.xor(number2)
    println(result)
}

Al ejecutar el programa, la salida será:

21

no bit a bit inv()

la función inv() realiza un no bit a bit. Hace que cada 0 a 1y cada 1 a 0.

35 = 00100011 (binario)
35la operación de complemento bit a bit
  00100011 
  ________
  11011100       = 220 (decimal)

Ejemplo: complemento bit a bit

fun main(args: Array<String>) {
    val number = 35
    val result: Int
    result = number.inv()
    println(result)
}

Al ejecutar el programa, la salida será:

-36

¿Por qué queremos imprimir -36 en lugar de 220

porque el compilador muestra el número2el complemento bit a bit. El signo negativo del número binario.

Para cualquier entero n, el complemento de n es2su complemento será-(n + 1).

 Decimal                                    Binario                      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)
Nota: Se ignora el desbordamiento mientras se calcula 2's complement.

35el complemento bit a bit de220 (decimal).22el complemento de 02El complemento a dos es-36Por lo tanto, la salida es-36en lugar de220.

operador de desplazamiento a la izquierda (shl)

la función shl desplaza el patrón de bits a la izquierda una cantidad específica de posiciones, y los ceros se desplazan a la posición baja.

212 (binario: 11010100)
212 shl 1 evalúa a 424 (binario: 110101000)
212 shl 0 evalúa a 212 (binario: 11010100)
212 shl 4 evalúa a 3392 (binario: 110101000000)

Ejemplo: desplazamiento bit a bit a la izquierda

fun main(args: Array<String>) {
    val number = 212
    println(number shl 1)
    println(number shl 0)
    println(number shl 4)
}

Al ejecutar el programa, la salida será:

424
212
3392

operador de desplazamiento a la derecha (shr)

la función shr desplaza el patrón de bits a la derecha en una cantidad de posiciones especificada.

212 (binario: 11010100)
212 shr 1 se calcula como 106 (binario: 01101010)
212 shr 0 se calcula como 212 (binario: 11010100)
212 shr 8 se calcula como 0 (binario: 00000000)

si el número es2su número complementario, entonces desplaza el bandera a la posición alta.

fun main(args: Array<String>) {
    val number = 212
    println(number shr) 1)
    println(number shr 0)
    println(number shr) 8)
}

Al ejecutar el programa, la salida será:

106
212
0

Operador de desplazamiento a la derecha sin signo (ushr)

La función ushr desplaza ceros a la posición más izquierda.

Ejemplo: Desplazamiento a la derecha con signo y sin signo

fun main(args: Array<String>) {
    val number1 = 5
    val number2 = -5
    //Desplazamiento a la derecha con signo
    println(number1 shr 1)
    //Desplazamiento a la derecha sin signo
    println(number1 ushr 1)
    //Desplazamiento a la derecha con signo
    println(number2 shr 1)
    //Desplazamiento a la derecha sin signo
    println(number2 ushr 1)
}

Al ejecutar el programa, la salida será:

2
2
-3
2147483645

Tenga en cuenta que para2El complemento a dos, la función de desplazamiento a la derecha con signo y la función de desplazamiento a la derecha sin signo trabajan de manera diferente.

2147483645de2El complemento a dos es3.