English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderá diferentes operaciones de bits en Swift. Se utilizan para cálculos de nivel de bits en expresiones.
Los bits se utilizan para representar números binarios. Un número binario puede tener dos valores posibles: 0 o1.Como programador principiante, no es necesario que utilice operaciones a nivel de bits.
El uso de tipos de datos primitivos, como integer, float, boolean, string, etc., es suficiente. Al trabajar en programación de bajo nivel, es posible que necesite trabajar a nivel de bits.
Además deOperaciones básicasAdemás, Swift proporciona un conjunto rico de operadores para operar con bits. Estos operadores son similares a los operadores lógicos, pero solo manejan la representación binaria de los datos (bits).
Los operadores de bits son operadores que se utilizan para cambiar los bits de los operandos. Los operandos son las variables o constantes en las que se realizan las operaciones.
A continuación, se enumeran todos los operadores de bits disponibles en Swift:
Se representa con el carácter de onda ~ y se puede aplicar a un operando único. Esto revertirá todos los bits. Es decir,1Cambiar a 0, cambiar 0 a1.
Si x es un valor binario almacenado (es decir,1) de variables/Si es una constante, la operación de negación de bits de la variable x se puede representar en la tabla siguiente:
x | ~x |
---|---|
0 | 1 |
1 | 0 |
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Cuando ejecute el programa anterior, la salida será:
254
en el programa anterior, la instrucción let initalNumber:UInt8 = 1 es de tipo unsigned int, con un tamaño de8bits. Por lo tanto, el decimal1puede representarse como 00000001binario.
El operador de no inversión cambia todos los bits de una variable o constante, cambiando el bit 0 a1mientras que1cambiará a 0. Por lo tanto, invertir el número contiene bits11111110. Después de convertirlo a decimal, representa254. Por lo tanto, la instrucción print(invertedNumber) se muestra en la pantalla254.
. También se puede realizar una operación de bits a nivel de bits, como se muestra a continuación:
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Cuando ejecute el programa anterior, la salida será:
0
initialBits contiene el valor binario11111111que corresponde a decimal255. Para representar un número en binario, escribimos 0b como prefijo en el texto. Si no hay 0b como prefijo, se lo tratará como un entero común y se producirá un error de desbordamiento (UInt8solo puede almacenar de 0 a255entre los números).
debido a que usamos el operador de no inversión, todos los bits1se convierten en 0. Por lo tanto, la constante reverseBits contiene 00000000, lo que es equivalente a UInt8donde todos los bits
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Cuando ejecute el programa anterior, la salida será:
-2
en el programa anterior, el decimal1puede representarse en binario como 00000001El operador de no inversión cambia todos los bits de una variable o constante, cambiando el bit 0 a1.1cambiar a 0. Por lo tanto, invertir el número contiene bits11111110. Esto debe aparecer en la pantalla254. En lugar de devolver-2. ¿Extraño, no? Vamos a ver cómo ocurre esto a continuación.
let initalNumber: Int = 1es un entero con signo, que puede contener tanto enteros positivos como negativos. Por eso, cuando aplicamos un operador no a un entero con signo, el número binario devuelto también puede representar un número negativo.
cómo el compilador -2 explicar11111110 ¿en forma binaria?
El compilador utiliza el complemento a dos para representar enteros. Para obtener el complemento a dos de un entero negativo, primero escriba el número en forma binaria, luego invierta el número y sume uno al resultado.
calcular-2los pasos para obtener el complemento a dos de un número en forma binaria:
escribir en forma binaria2: 00000010
invertir el número. 0 se convierte en1mientras que1y se convierte en 0:11111101
sumar1: 11111110
Esto es lo que el compilador convierte en números binarios1111110interpretado como decimal.-2de manera. Pero, el compilador tiene un pequeño problema que no hemos notado. También infiere el tipo de invertedNumber como Int8tipo.
Para entender esto, veamos el siguiente ejemplo:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Cuando ejecute el programa anterior, la salida será:
-2 254
En el ejemplo anterior, el compilador solo considera enteros con signo8bits integer trata el número binario como decimal-2。 Por lo tanto, la instrucción print(Int8(bitPattern: 0b11111110)) se muestra en la pantalla-2.
pero para el tamaño de32/64bits y puede contener tipos de enteros comunes que pueden manejar valores más grandes, interpretando el valor como254。 Por lo tanto, la instrucción en la pantalla print(0b11111110) se muestra254.
Se representa con &, y puede aplicarse a dos operandos. El operador AND compara dos bits, y si ambos bits son1devuelve1de lo contrario devuelve 0.
si x y son variables/Constantes, que guardan valores binarios, es decir, 0 o1。 La operación AND de bits entre x y y se puede representar en la siguiente tabla:
x | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:", String(result, radix: 2)) print(result)
Cuando ejecute el programa anterior, la salida será:
Binary: 10000011 131
En el programa anterior, la instrucción let result = xBits & yBits combina los bits de dos operandos xBits y yBits. Si estos bits son1devuelve1de lo contrario devuelve 0.
String(value, radix: ) como inicializador para representar números en diferentes sistemas de numeración. Si proporcionamos el valor base2。 Convierte el número en un sistema de números binario. Del mismo modo, podemos usar16representa hexadecimal, usando10representa decimal.
La declaración print("Binary:",String(result, radix: 2)) se muestra en la pantalla Binary:10000011.10000011igual a decimal131, la instrucción print(result) muestra el resultado en la consola131.
Se representa con |, y puede aplicarse a dos operandos. Si uno o más de los inputs del operador OR de bits es1, se compara el bit y se genera el resultado1, de lo contrario es 0.
Si x y son valores binarios mantenidos (es decir, 0 o1) de variables/Constantes, la operación OR de bits entre x y y puede representarse en la siguiente tabla:
x | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Cuando ejecute el programa anterior, la salida será:
Binary: 11111111 255
En el programa anterior, la instrucción let result = xBits | yBits combina los bits de dos constantes xBits y yBits. Si algún bit es1devuelve1de lo contrario devuelve 0.
La instrucción print("Binary:", String(result, radix: 2)) se muestra en la pantallaBinary:11111111。 Debido a11111111y255equivalente en decimal, por lo que la instrucción print(result) muestra el resultado en la pantalla255.
Se representa con ^, y puede aplicarse a dos operandos. El operador XOR compara los bits, y si solo uno de los inputs es1genera el resultado1de lo contrario devuelve 0.
si x y son variables/Constantes, que guardan valores binarios, es decir, 0 o1. La operación XOR de bits en x y y se puede representar en la siguiente tabla:
x | y | x ^ y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits ^ yBits print("Binary:", String(result, radix: 2)) print(result)
Cuando ejecute el programa anterior, la salida será:
Binary: 1111100 124
En la declaración del programa anterior, let result = xBits ^ yBits combina los bits de dos constantes xBits y yBits. Si uno de los bits es1devuelve1de lo contrario devuelve 0.
La declaración print("Binary:",String(result, radix: 2)) se muestra en la pantallaBinary:1111100(equivalente a 01111100). Debido a1111100 equivalente124En decimal, por lo que la declaración print(result) se muestra en la pantalla124.
Este operador se utiliza para mover todos los bits de un número a la izquierda o a la derecha una cierta cantidad de posiciones y se puede aplicar a un solo operando. Se representa como << o >>.
Los operadores de desplazamiento tienen dos tipos:
Se representa como <<
Esto causará que los bits se desplacen a la izquierda, lo que se especifica por el número seguido de <<.
Los espacios dejados por la operación de desplazamiento se rellenan con ceros.
Desplazar los bits de un entero a la izquierda duplicará su valor
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Cuando ejecute el programa anterior, la salida será:
136
En el programa anterior, usamos el operador de desplazamiento a la izquierda. Usando <<1Se representa como desplazamiento a la izquierda1. Estos números se desplazan una posición a la izquierda, rellenando el último número a la derecha con ceros.
Puedes ver que los números desplazados desde la izquierda 'extremo' se pierden. No regresarán desde el lado derecho. Al desplazarlo una posición a la izquierda, se eliminará de binario1y agrega 0 a la derecha para rellenar el valor de desplazamiento, mientras que el resto de los bits se desplazan a la izquierda1.
devuelve10001000, equivalente a UInt8en136Por lo tanto, print(someBits<<1) se muestra en la pantalla136.
Se representa como >>
Esto causará que los bits se desplacen a la derecha, seguidos del operador >>
Para números enteros sin signo, los espacios dejados por la operación de desplazamiento se rellenan con ceros.
Para números enteros con signo (también pueden ser números negativos), el bit de signo se utiliza para rellenar los espacios dejados por el desplazamiento. En otras palabras, si el número es positivo, se utiliza 0; si el número es negativo, se utiliza1.
Al desplazar una posición a la derecha, su valor se reducirá a la mitad.
let someBits: UInt8 = 4 print(someBits >> 1)
Cuando ejecute el programa anterior, la salida será:
2
En el programa anterior, usamos el operador de desplazamiento a la derecha para enteros sin signo. Se usa >>1lo que significa que se mueven los bits1. Los bits que se desplazan para enteros sin signo siempre se rellenan con ceros.
Porque,4representado en binario como 00000100. Desplazar a la derecha una posición, devuelve 00000010, equivalente a UInt8en2. Por lo tanto, print(someBits>>1) se muestra en la pantalla2.
let someBits:Int = -4 print(someBits >> 1)
Cuando ejecute el programa anterior, la salida será:
-2
En el programa anterior, usamos el operador de desplazamiento a la derecha para enteros sin signo. A diferencia de los números positivos, para los números negativos se usa1rellenado con ceros en lugar de 0.
Porque,-4representado en binario como11111100. Desplazar a la derecha una posición y1rellenado con ceros, devuelto11111110, lo que es equivalente a Int8del tipo-2. Por lo tanto, print(someBits>>1La instrucción ) se muestra en la pantalla-2.