Hola y bienvenido. Hablemos de operadores bit a bit.
Le mostramos un pequeño vistazo de esto en la lección anterior cuando hablamos sobre los operadores de
asignación porque los operadores de asignación tienen todas estas asignaciones compuestas donde
puede realizar una operación como una suma y luego también asignar.
Puede hacer lo mismo con estos operadores de tipo.
Pero entremos en estos más detalles y le diremos exactamente cuáles son.
Entonces c ofrece operadores lógicos bit a
bit y operadores de desplazamiento. Es posible que esos términos no tengan ni idea.
Parecen operadores lógicos, pero son bastante diferentes. No hacen ningún tipo de
evaluación booleana. No evalúan verdadero o falso.
Parecen el ampersand y el ampersand, los 2 ors, pero
no están haciendo ningún tipo de evaluación booleana.
Lo que están haciendo es que operan en bits, dentro de valores enteros.
Y entonces puedes preguntarte por qué diablos querrías hacer esto. Bueno, no se usa
en la mayoría de los programas. Es más una técnica avanzada.
Aunque esta es una clase para principiantes. Son parte de los operadores y los operadores son un concepto para principiantes.
Así que voy a abordarlos, pero no necesariamente nos vamos a centrar en ellos.
Te daré algunos ejemplos, te mostraré cómo puedes usarlos.
Pero no vas a ser un experto en esto después de esta conferencia.
Pero la forma en que son útiles y la razón por la que realmente querría usarlos es
porque puede almacenar una gran cantidad de datos.
Entonces, hay operandos bit a bit llamados y, ampersand y bit a bit o que
es una o solo una barra paralela.
Trate de no confundirlos nuevamente con los operadores lógicos.
Los operadores lógicos tienen 2 de ellos, ampersand y ampersand, que es y.
Los operadores bit a bit solo tienen un archivo. Así que solo un ampersand o solo un o.
Entonces, lo que van a hacer es probar y establecer bits individuales
dentro de una variable entera. ¿Qué es un poco?
Sabemos que un poco es una forma de medir datos.
Pero un poco es esencialmente un valor de 0 o 1.
Y 8 de ellos forman un byte. Entonces, un bit es un 0 o un 1.
Y lo que puede hacer es un número
entero, recuerde, dependiendo del sistema que esté ejecutando, podría ser de 8 bytes.
Y así podría encender y apagar cada bit.
Y cuando digo encender o apagar, estoy diciendo que puede hacer que sean iguales a 1 o 0.
Y luego puedes usar esos bits para decirte algo.
Por lo tanto, puede almacenar una gran cantidad de datos haciendo que los bits representen algún tipo de datos.
Es por eso que una de las razones por las que
la computadora usa bits en 1 y 0 y números binarios para realizar operaciones es porque puede almacenar una
gran cantidad de datos. Ahora, exactamente lo
que esto significa es aquí un ejemplo. Podría utilizar una única variable entera.
Una vez más, un número entero es un número, un número entero representa de 4
a 8 bytes dependiendo del sistema que esté ejecutando.
Eso significa que si hay 4 bytes, significa que hay 32 bits.
Hay 32 valores 0 o 1.
Entonces puedes usar todos esos bits para representar algo.
Entonces, por ejemplo, si desea almacenar caracteres individuales de una persona, podría tener 1
bit, decirle si la persona es hombre o
mujer diciendo que 1 es igual a hombre 0 es igual a mujer.
Simplemente lo enciende o lo apaga.
Luego, podría usar 3 bits para especificar
si la persona puede hablar francés, alemán o italiano.
Entonces el 1 bit podría representar francés. Si no es 10,
significa que no hablan francés.
Si el alemán es 0, eso significa que no hablan alemán.
Si es 1, significa que hablan alemán. Entonces, al apagar y encender estos bits, configurándolos
de 1 a 0, puede representar una gran cantidad de datos.
Podría tener otro bit para registrar si el salario de la persona es 50.000 o más.
Si es 1, es cierto, sí, lo es. 0 falso.
Básicamente, acabamos de especificar aquí.
En realidad dice 4, pero en realidad especificamos 5 bits de
datos, solo 5 de si tenemos o no 32
o si tenemos 64 bits, pero solo usamos 5 y
podemos representar si una persona es mujer o hombre. , hablen o no francés,
alemán o italiano o los 3 o uno o el otro.
Y si están ganando más de 50.000 dólares o no.
Podemos representar todos esos datos en nuestros bits.
Y aquí es donde los operadores bit a bit son útiles.
Ahora que sabemos cómo podemos usar bits para almacenar muchos
datos diferentes. Hablemos de esos números binarios.
Sabemos que un número binario es solo un número que incluye unos y ceros.
Y es por eso que es ventajoso usarlo. Operadores de bits en un número entero, el
número puede tener cualquier longitud.
Los siguientes son ejemplos de números binarios, solo 0 y 1.
Entonces has visto esto 0 1 0 1 0 1 1 0 1 0 1 0.
Y recuerde que un byte tiene 8 bits.
Un número entero suele ser de 4 bytes en la mayoría de las plataformas.
Depende de la arquitectura, pero sobre todo de 32 bits.
Entonces tiene 32 valores que puede almacenar con 1 y 0 para indicar encendido o apagado.
Números binarios, nuevamente, cada número binario tiene un valor decimal correspondiente,
por lo que debe comprender cómo convertir binario a decimal.
Ejemplos aquí 1 es igual a 1, 1 0 es 2, 1 1
es 3, estas son conversiones simples.
Nuevamente, generalmente tienen más bits, 1 0 1 0 1 1 1.
La forma en que desea convertir los números binarios a
un número decimal es buscar cada
posición en el byte con el bit correspondiente y luego usar la potencia de 2.
Entonces, para cada dígito, multiplique el dígito por su valor de
posición usando la potencia de 2. Y luego sumas todo el proyecto para obtener el resultado final.
Entonces, los valores de posición y un número binario son las potencias de 2.
Entonces, la primera posición sería el valor 2 0,
que, en otras palabras, sería 1.
Y luego la segunda posición sería el valor de 2 a la primera potencia que es
2, 2 a la 2 sería 4, 2 a 3 sería 8,
2 a la 4 sería 16. Y sigues haciéndolo
una y otra vez. Y entonces es más fácil de entender si ve un buen ejemplo.
Y aquí tenemos un número binario de 0 1 1 0 1 0 0 1.
El equivalente decimal de eso es 105.
La forma de convertir es comenzar en el lado derecho para cada bit
y multiplicar a la potencia de 2 dependiendo de si el bit es 0 1.
Entonces, si comenzamos todo el camino hacia la derecha, tenemos 1.
Entonces decimos 1 por 1 y mantenemos ese 1. Luego, el siguiente 1, la
segunda posición es 0 por 2 0. Luego 0 por 4, 1
por 8, 0 por 16,1 por 32, 1
por 64 y 0 por 28.
Y sumas todos esos y obtienes el resultado de 105.
Esa es una forma de convertir. En realidad, también puede convertirlo de
izquierda a derecha multiplicando por 2 y luego agregando 1 o agregando
0, dependiendo de cuál sea el siguiente bit. Entonces, por ejemplo, también
puede, si va de izquierda a derecha,
comenzar con 1 porque 0 no importa.
Entonces, el segundo bit que va de izquierda a derecha, tiene 1.
El tercer bit, tiene 1 por 2 más 1, por
lo que tiene 3.
Y de nuevo, multiplica por 2, por lo que dice 3 por 2 más 0, que es 6.
6 por 2 más 1, que es 13.
13 por 2 es 26.
26 por 2 es 52
por 2, que es 104 más 1.
Entonces, multiplique nuevamente por 2 y luego agregue 1. Otro ejemplo, de nuevo, de
derecha a izquierda suele ser un poco más fácil.
Aquí está 1 0 0 1 1 1 0 0.
Y eso se convierte en 156 porque dices de nuevo 0 por
1, 0 por 2, 1 por 4, 1 por 8, 1 por
16 y así sucesivamente y luego
los sumas todos juntos, que es 4 8 12 16 28 más 128 es 156 .
Y nuevamente, si vas de izquierda a derecha, multiplicas por 2 y sumas 1.
Entonces comenzamos por 1. Digamos 1
2 4 9, 4
por 2 más 1, 9 por
2 es 18 más 1 es 19 por
2, 38 más 1 es 39 por 2 que
es 78 por 2 que es 156.
Así que esta es una demostración rápida de cómo
puede convertir binario a decimal. Ahora, al convertir decibelios en binarios,
por lo general solo uso una conversión en
la web si está realmente interesado en eso. Pero puede tomar estos números binarios y luego realizar operadores
bit a bit. Echemos un vistazo a los operadores bit a bit.
Entonces, los operadores bit a bit se resumen aquí. Y de nuevo, tengo otra buena tabla
en línea, pero se parecen a los operadores lógicos. Pero de nuevo, no los confunda.
Entonces, el ampersand por sí mismo es un operador binario.
Entonces, lo que está haciendo es copiar un poco al
resultado si existe en ambos operandos. Entonces, si ambos son ciertos, entonces
se copiará un poco.
Entonces, si ayb es igual a 12, tendrás
una representación binaria de 0 0 0 0 1 1 0 0.
Entonces ayb serían
ese número. Veremos algunos ejemplos.
Un binario o copia un bit si existe en cualquiera de los operandos, por
lo que aob copiará un bit
si existe en cualquiera de los operandos. Entonces, si cualquiera de
los operandos es igual a 1, se copiará un poco.
Y luego el xor binario, este es el o exclusivo.
Esto copiará el bit si está configurado en 1 operando pero no en ambos.
Entonces, si tiene un verdadero, pero solo 1 verdadero
y usa la zanahoria para representar esto en su teclado, entonces se
va a copiar un poco y va a decir que
es verdadero,
complemento de 1 binario.
Entonces, nuevamente, estamos obteniendo los datos binarios aquí porque estamos hablando de bits. Así que, con suerte, el complemento
de 1.
El operador es unario y tiene
el efecto de voltear los bits, básicamente negando y quitando el monitor.
Entonces, un ejemplo aquí fue si dices tilde a, estás
aplicando el operador de complemento a 1.
Y si es igual a 61 negativo, será 1 1 0 0 0 0 1.
Entonces, si tuviera que convertir ese número binario
a decimal, que es un número negativo y el primer
número es el signo. Entonces te digo que es una señal.
Y luego dices 1 2 4 8 16 33
y luego 61, así es como se representaría.
Así que pasaré por ejemplos más concretos de esto.
Pero básicamente, si tiene un número binario, a es inicialmente un número binario que es 0 0 1
1 1 1 0 0, que es 60 y usted
proporciona el cambio, básicamente, se convertirá en 61
negativo, que es 1 1 0 0 0 0 0 0 0 0 0 1 1.
Entonces, estos son los resultados de las variables que realmente se establecen. Entonces, nuevamente, supongo que
a tiene cierta representación binaria yb tiene cierta representación binaria.
Entonces, si a es igual a, nuevamente, 60 yb
es igual a 13, entonces el resultado de sumarlos juntos haciendo un
bit a bit será 0000 11 00, que es 12.
Una vez más, revisaré estos ejemplos, pero esto está tratando de proporcionar
una pequeña descripción de estos diferentes operadores binarios.
El símbolo menor que menos que desplazará los bits hacia la izquierda.
Entonces, el valor del operando izquierdo se mueve a la izquierda por el número de bits especificado por el operando blanco.
Entonces, si haces algo como menos que
menos que 2
y a es realmente igual a que conoces algún
número binario, por ejemplo, 0 0 1 1 1 1 0 0, vas a
cambiar los bytes en 2.
Entonces vas a quitar los 0 y se convertirá en 1 1 1 1, y esos 0 llegarán al final.
Y lo mismo con el operador de turno correcto. Simplemente los está moviendo hacia la derecha en lugar de hacia la izquierda.
Aquí usa los símbolos mayor que.
Y entonces voy a repasar estos en un segundo.
La otra cosa importante para entender con los operadores bit a
bit es cómo evaluar estos valores ayb. Entonces, ¿qué evalúa un
1 y un 1 en un 1, si
es un ampersand? Si es un o 1
y 1 también se evalúa como 1.
Pero un 1 y un 1 y un 0 si estás usando un ampersand
haciendo un y, eso se evalúa como 0 falso. Así que solo quería proporcionar una pequeña
tabla de verdad aquí que le muestre los valores cuando
lo está haciendo, usa una y una o una o exclusiva.
Entonces aquí, si tiene p0 y q0, lo que significa que ambos son
falsos y aplica un y, será falso
porque ambos tienen que ser verdaderos para que eso sea cierto.
Y eso es lo que ves en la fila 3.
Ambos son verdaderos, entonces pyq se evaluarán a 1, verdadero.
Si no son ambos verdaderos, siempre es falso.
P o q solo uno de ellos debe ser cierto.
Entonces, es por eso que ve las filas 1 y las filas 2 iguales a 1 y la fila 3 igual a 1.
La única vez que es falso es cuando ambos son falsos.
Y luego el exclusivo o es al menos 1 de ellos
es cierto, y solo 1.
Entonces, si p es falso yq es verdadero, devolverá verdadero.
Y si p es verdadero y q es falso, devolverá 1.
Entonces esto le da una idea de cómo se evalúa.
Una vez más, muchas cosas matemáticas, pero cuando hablamos de dígitos binarios, de eso es de lo que estamos hablando.
Así que veamos algunos ejemplos concretos y bloques de código. Con suerte, esto ayudará un poco.
Así que aquí está nuestra función. Voy a crear un par de variables más.
Me aseguraré de que no estén firmados
aunque sea por defecto. Entonces, si digo unsigned int a
y lo asigno a 60, en realidad se representará en binario como 0
0 1 1 y luego 11 00.
Si creo otra variable sin firmar y digo int
by le asigno el valor de
13, en realidad se representará como en el binario 0 0
00 1 1 0 1. Puedes hacer las conversiones allí.
Pero lo que quiero demostrar aquí es que cuando configura estos números
binarios, puede desactivar los bits utilizando los diferentes operandos bit a bit.
Entonces, ahora voy a crear un resultado int, y voy a decir
que será igual a 0.
E va a contener el resultado de la operación bit a bit.
operación. Ahora, si digo que c es igual
a ay aplico el operando bit a bit y a y b, ahora lo
que debería hacer es si a es igual a 1 y b es igual a
1, esos bits se activarán. Entonces, ¿qué esperarías del resultado de este v.
Bueno, miras el primer bit de a y miras el primer bit de b
y ambos son 0.
Entonces, el resultado será 0 porque
si lo haces verdadero en ay a b, ambos tienen que ser verdaderos para ser 1.
Entonces, el siguiente también será 0. El siguiente es 1 y 0, el tercer bit.
Entonces sigue siendo 0, 1 y 0 sigue siendo 0. Y luego ahora tenemos un 1 y un 1.
Así que ahora finalmente tenemos un verdadero. Tenemos otro 1 y 1. Tenemos un verdadero.
Y luego 0 y 0 serán 0 y luego 0 y
1 serán 0.
Entonces, el resultado si intentara imprimir c, imprimirá el
valor en formato decimal. Si tuviera que hacer algo
así, imprimiría el equivalente decimal de ese número binario, que sería
el equivalente a 0 0 0 0.
Y todo esto es convertir binario a decimal, por lo que debe
comprender cómo hacerlo para comprender este ejemplo. Pero 0 0 0 0 1
1 0 0 es en realidad 1 3 7, el valor
es en realidad 12, 1 3 6 12.
Entonces esto imprimiría doce
si imprimiera
co el resultado sería mejor.
Entonces, si ejecuto esto, verás que el valor es 12.
En realidad, apagó y encendió todos los bits según la comparación comercial.
Así que ahora
digo ejecutar, vemos que el valor está en d12 porque
está apagando y encendiendo los bits y en
realidad se representará como 0 0 0 1 1
0 0 que es el valor 12 porque estamos imprimiendo un decimal .
Si tuviera que cambiar esto y ahora quiero hacer
una o y todavía estoy haciendo la o y la o recuerda
es la
barra paralela justo al lado de la entrada, ahora solo activaré los
bits si 1 es verdadero. 00, ambos son
falsos. Nuevamente, estoy comparando aquí.
Estoy comparando estos bits para 16 y 13.
16 se representa como binario 0 0 1 1 1 1 0 0.
13 se representa en binario 0 0 0 0 1 1 0 es 1.
Cada uno de esos números representa un poco.
Entonces, el primer bit en 60 es 0, el primer bit en 13 es 0.
Y si los ordeno juntos, 0 y 0, todavía obtendré 0. Entonces ese es el primer resultado del primer bit.
Segundo bit 00 de nuevo. El tercer bit es 1 por 60
y 0 por 13.
Ahora todo eso significa que tengo que tener 1 verdadero, por lo que será un 1.
Lo mismo ocurre con los bits número 4 y 16, 13. Así que ahora tengo un 1 de nuevo.
Y luego un 1 y un 1, ambos son verdaderos. Así que de nuevo 1, todo
lo que necesito es 1 verdadero, otro 1.
Ambos son falsos, así que eso no va a ser cierto. 0, recuerde que no es
cierto, 1 es cierto y 0 11. Entonces ahora tengo 0 0 1 1 1 1 0 1.
Y el valor de eso en decimal si tuviera
que imprimirlo es nuevamente, tienes que entender cómo
convertir binario a decimal, pero básicamente va 1 3
7 15 30 61. Así que esto imprimirá 61.
Finalice este programa y vuelva a
generarlo, y veremos un valor de 61.
Eso es operadores bit a bit. Y de nuevo, es más
un tipo de programas avanzados, pero es una buena forma
de representar una gran cantidad de datos mediante el uso de símbolos y
demás, activando y desactivando bits, esencialmente. Así que podrías jugar
con esto. Podrías hacer la exclusiva o cuál es la zanahoria.
La zanahoria está por encima del 6, número 6 en el teclado.
Vería un resultado diferente. Si agrega la tilde, eso básicamente apagará todo.
Entonces, para ay a es igual a 60, 0 0 1 1 1 1 0 0, no
va a ser igual a 1 1 0 0 0 0 1 1.
Otra cosa realmente interesante que puede hacer con los operadores binarios es desplazarse, desplazarse
hacia la izquierda y hacia la derecha. Hay un par de cosas clave que sabe cuando necesita
desplazarse hacia la izquierda o hacia la derecha.
En primer lugar, sabemos que un int sin signo significa que
solo puede ser positivo. No puede ser negativo.
Entonces, si está almacenando un valor negativo allí, la compilación lo convertirá, será más largo, ocupará mucho tamaño.
Por lo tanto, recuerde que las entradas sin firmar significan que solo puede tener valores positivos.
Los números enteros con signo significan que pueden ser negativos o positivos.
Pero si desea cambiar, recuerde
que debe desplazarse hacia la izquierda, así que ahora si decimos que
el resultado es igual y digamos que queremos cambiar a, digamos, por 2,
la otra cosa importante
que desea saber es cuándo tiene los números enteros
son, recuerde, son 4 bytes en la mayoría
de las plataformas. Depende de que pueda obtener
el tamaño haciendo el tamaño del operador. Entonces, el entero es realmente
4 es de 32 bits, por lo que realmente el
número es algo como esto. Los 16 algo
así, ¿qué es eso? 4 8 12 16 20 24.
Así que probablemente tengas algo así y algo así.
Ese es realmente el número. Solo mostré los últimos
8 bits porque el resto eran 0. Pero si lo mira como un entero
de 32 bits, que es de 4 bytes, así es como se
ve en binario, 4 0s 4 0s 4 0s 4 0s 4 0s 4 0s
y luego el 0 0 1 1 1 1 0 0 .
Y entonces tienes que saber el tamaño cuando haces el cambio hacia
la izquierda o hacia la derecha porque si cambias más de 2, no estará claro.
No se cae ni nada de eso.
De nuevo, permítanme asegurarme de que 48 12 16 20 24 28
32 y lo mismo se aplicaría a 13.
Entonces, si tuviera que desplazarse hacia la izquierda un mayor
que mayor que 2, lo que terminará teniendo es que estos 1
también se desplazarán hacia la izquierda. Entonces, el resultado seguirá
siendo todos los ceros anteriores, pero
luego tendrás 1 1 1 1 0 0 0 0.
Y eso va a ser igual a 240.
Y si hago una conversión rápida, lo hago en mi cabeza
diciendo 1 3 7 15 30 60 122 40,
pero podemos confirmarlo construyendo y ejecutando y verá que
el resultado es 240.
Y vemos que el resultado es 240.
Entonces, si realmente desea cambiar a mis más de 2 s, digamos
que desea cambiar en 4, aquí es cuando es importante comprender que es un número de 32 bits.
Así que aquí tendrías que usar algunos de esos 0.
Entonces, si quieres cambiar en 4, realmente lo que tendrías
es algo así.
Y luego, si quieres agruparlos
por 4, tendrías
algo así. Entonces, el resultado
aquí sería nuevamente si hago esto en
mi cabeza, tienes 1 3 7 15
30 60120240480 y luego 960.
Con suerte, lo hice bien. De nuevo, cuando ejecutamos esto y
decimos 960, se está desplazando
hacia la izquierda. Si desea desplazarse
hacia la derecha, utilice los símbolos mayor que.
Entonces, cambiando al operador de cambio binario derecho derecho,
haces el mayor que. Operador binario de desplazamiento a la izquierda, usted hace menos que.
Así que aquí, si vas a desplazarte hacia la derecha, debes moverte hacia la derecha 4.
Y qué pasa si tienes el final aquí, así que si tienes
tus 60 originales, intenta ir 4. Vas a tener dígitos que simplemente se eliminan.
Entonces, en lugar de tener estos últimos 4 que
originalmente nuevamente tenemos 60. Entonces tenemos 0
0 0 1 1 1 1 0 0, tenemos que movernos sobre 4.
Así que vamos a terminar perdiendo 2 bits porque simplemente se van a caer.
Y lo que vamos
a terminar es algo como
este 0 0. Entonces, esto sería igual a 3, algo
así, por lo que en realidad pierdes bits porque te estás desplazando demasiado hacia la
derecha, tienes el resultado de 3. Por lo tanto, debe tener cuidado
cuando se desplaza hacia la izquierda y hacia la derecha, asegúrese de usar esos
32 bits 4 bytes nuevamente dependiendo de su sistema.
Es un resumen rápido de los operadores bit a bit.
Cuando avanza, debe comprender cómo puede verificar
si un bit en particular es 1 o 0.
Es bastante simple. Simplemente haz una y otra vez.
Pero tienes que escribir un poco más de código.
Esta conferencia no pretendía ser una mirada exhaustiva a los operadores bit a bit.
Quería dar una descripción
general, darle una buena ventaja. Pero para comprender mejor estos operadores,
tendrá que estudiar un poco más y usarlos y practicarlos.
Así que espero que esto haya sido útil. Una vez más, puede resultar un poco confuso,
por lo que querrás seguirlo y jugar con él. Pero nuevamente, cuál es la mejor manera de
aprender, escribir código, aprender algunos ejemplos. Gracias.