[AUDIO EN BLANCO] Hola. Bienvenidos a la lección tres del módulo dos, donde vamos a hablar de programa y control de flujo. Vamos a empezar hablando sobre variables y lógica booleana, que ya hemos hablado de variables. Algo entendemos de lógica booleana, que hablamos en el módulo uno y ahora vamos a ver cómo se usan estas variables en el código de programa. Entonces recordemos un poco que el bit es la unidad de información más pequeña, lo vimos en el módulo uno y que pueden representar dos estados, de una variable binaria, verdadero o falso, también hablamos de uno lógico o cero lógico. La lógica booleana establece la operatoria entre bits, esta lógica booleana la vimos en el módulo uno con las operaciones lógicas fundamentales NOT, AND y OR. Además los bits se pueden agrupar en palabras, por ejemplo la palabra de ocho bits es un byte, y básicamente en un programa todas las variables son agrupaciones de bits. Ya vimos en el módulo anterior que los diferentes tipos de variables, algunas usan ocho bits o sea un byte, algunos usan dos bytes, etcétera. Pero en el fondo internamente en los registros del procesador, todas se guardan como bits. Entonces básicamente nosotros podemos tratar cualquier variable en una cierta base decimal o en la base binaria, o en otras bases que por ahora no nos vamos a iii mucho de esta otras bases pero sí vamos a hablar de una lógica decimal y binaria. Por ejemplo, si aquí yo estoy en el código y escribo el número 123, el código interpreta esto por defecto como un decimal, es decir yo tengo uno por 10 elevado a dos más dos por 10 elevado a uno más tres por 10 elevado a cero, esto me da el número 123 como nosotros lo conocemos. Pero lo guarda en el registro de manera binaria, entonces tiene que tener clara esa iii. ¿Qué pasa si yo quiero escribir un número de forma binaria? Tengo que anteponer una b, entonces yo escribo b, y por ejemplo si quiero escribir el número cinco, escribo uno cero uno cero cero cero cero cero, aquí tengo un, dos, tres, cuatro, cinco, seis, siete, ocho, ocho bits y antepongo el b alante. Entonces el código va a saber que esto que estoy haciendo aquí equivale a un cinco en base decimal, y se guarda directamente así. ¿Por qué yo querría escribirlo de forma binaria en vez de escribirlo en forma decimal? Porque quizá a mi no me interesa la interpretación decimal, sino que me interesa trabajar bit por bit, aplicando operaciones por bit y eso es lo que vamos a ver a continuación. Ya vimos las operaciones lógicas fundamentales que aplican en la lógica booleana en el módulo anterior que son las compuertas, vimos la compuerta OR, la compuerta AND, la compuerta NOT por ejemplo o bien la compuerta NAND, la compuerta NOR. Entonces todas estas compuertas yo puedo aplicarlas bit a bit. Entonces supongamos que yo tengo una variable que es un entero y le vamos a poner a, y esta tiene 16 bits entonces queda en base decimal, puede ser uno cero cero uno, etcétera, hasta llegar a cero uno uno, en total tengo 16 bits. Entonces yo puedo aplicar operadores booleanos independientemente a cada bit, o sea yo puedo hacer por ejemplo a AND si uso este, AND y puros unos, uno, uno, uno, 16 unos. ¿Y qué va a hacer esto? Bueno, qué hace a AND uno, o sea a ver si a es cero, AND uno me vuelve cero, si a es uno, AND uno me vuelve uno, por lo tanto esta operación no cambió nada. ¿Qué pasa si por ejemplo yo hago un AND con puros unos excepto este que es un cero? Qué va a hacer, a todos los bits de la variable los va a dejar iguales porque el primer bit AND uno me devuelve el primer bit, sea uno o sea cero, este bit AND uno me devuelve el mismo bit. El único que cambia es el que está con AND cero, y ¿qué va a hacer ese bit sea lo que sea el valor original del a? Se va a transformar en un cero, entonces yo de esta forma aplicando operaciones lógicas por bit puedo cambiar un bit en particular de una variable y no operar sobre la variable completa. Y todos estos operadores funcionan de la misma manera, aquí tengo un AND, tengo un OR, XOR, que ese no lo hemos visto, es un OR exclusivo. ¿Qué quiere decir? Que su tabla de verdad, si yo tengo dos entradas uno cero cero uno uno uno cero cero, esto es uno solamente si es que tengo un uno y un cero, es decir recordemos como era el OR, si había al menos un uno valía uno, por lo tanto uno en estos tres casos, cero en este otro. El AND uno AND cero me da cero, cero AND uno me da cero, uno AND uno me da uno, cero AND cero me da cero. ¿Cómo funciona el XOR? El XOR es uno si es que hay únicamente un uno, o bien es lo mismo decir si estas dos variables son diferentes, por lo tanto uno XOR cero me da uno, cero XOR uno me da uno, uno OR exclusivo uno me da cero, y cero OR exclusivo cero me da cero. Esta es la tabla de verdad de la operación XOR. La operación NOT la hemos visto y estas son la operación para hacer shift que es lo que hacen básicamente si yo tengo este bit por ejemplo y le aplico shift a la izquierda lo que hace es que todos los bits se mueven hacia la izquierda, este se va, me queda cero uno uno y el bit que entra es un cero. Lo mismo así lo aplico hacia la derecha. No es importante que pongan atención a estos operadores, sí vamos a usar en algunos ejemplos estos operadores pero no se preocupen por ahora se ve un poco complicado. A medida que lo vayamos usando todo va a ser más simple. Entonces como le mencionaba antes uno puede cambiar un solo bit aplicando las funciones AND, esto fue lo que vimos recién y de la misma manera uno puede aplicar el operador OR para cambiar cualquier bit a uno. Entonces a ver, queremos entender esto un poco mejor. ¿Cuál es el resultado de la operación A ese signo por representa AND, uno? Como resultado siempre me da el mismo bit, entonces como vimos antes si yo hago un AND bit por bit por un arreglo de puros unos, no hay que cambiar nada. Si uno de esos es un cero o cualquiera de esos es un cero me va a cambiar el valor específico de la variable inicial por un cero. De la misma forma qué pasa con el OR, entonces si yo hago por ejemplo a OR cero, el resultado es a, sin importar el valor de a, entonces si hacemos a OR uno, el resultado es uno sin importar el valor de a, o sea cero no cambia, uno cambia. Entonces de la misma forma que hice con AND hago los inversos aquí. Así es que yo hago un AND con puros ceros no cambia, cualquiera de los bits que sea un uno sí cambia. Esto se llama enmascaramiento y se usa normalmente para hacer cambios de un solo bit. Insisto que en toda esta operatoria bit por bit se usa en los programas no se usa tanto, pero es importante de que tengan la noción de cómo funciona para que cuando se encuentren con ella puedan ir a la referencia y entenderla. No se preocupen demasiado de que les quede todo completamente claro en este momento, más adelante va a tener más sentido. Ahora vamos a pasar a algo que es similar pero que es súper clara qué son los booleanas y las operaciones de comparación, porque como vimos al principio, hay variables que son booleanas significa que pueden tomar dos valores, uno cero, verdadero falso, alto bajo, en general el lenguaje iii son bastante equivalentes, se pueden intercambiar. Pero ¿cuál es la diferencia entre una variable booleana y una operación por bit? Es que la variable completa toma un valor uno o cero, no cada bit de la variable y se aplica lógica booleana sobre la variable completa también. Entonces vamos viendo, ya sabemos que las variables booleanas pueden tomar valores uno cero, alto bajo. Hay operadores booleanos que son los mismos que hemos visto que son AND, OR, y NOT, pero tienen una sintaxis diferente que la vamos a ver ahora. ¿Y por qué nos interesa trabajar con variables booleanas? Porque hay muchas operaciones que tienen como retorno variables booleanas, por ejemplo el resultado de comparación, que si yo en el programa comparo por ejemplo, es a menor que b, la respuesta que me va a dar el programa va a ser true o false, equivalente a uno o cero, y esa es una variable booleana y esa es la variable que yo voy a manejar. Entonces por eso este tipo de variables es particularmente importantes en el código más que las operaciones de bit por bit. Entonces ¿cuáles son las operaciones de comparación que podemos usar? Y veamos la sintaxis, comparación con igual, y aquí hay que notar que es diferente decir a igual uno por ejemplo, cuando yo estoy asignando el valor uno a la variable a, que si hago a igual igual uno donde aquí estoy comparando la variable con uno. El resultado de esto es que la variable va a tener el valor uno, el resultado de esto es que a es uno y yo obtengo true si a no es uno, y yo obtengo false. O sea hay que tener mucho cuidado de no confundir el igual con el doble igual. Después está el operador distinto, que es prácticamente lo contrario de comparar una igualdad. Si son distintos me da verdadero si son iguales me da falso. Después puedo comparar menor, mayor, menor o igual, mayor o igual. Y esto se aplica todo de la misma manera, yo quiero hacer una comparación entonces comparo a por ejemplo menor o igual que uno y esto me va a devolver verdadero si es que a es menor o igual que uno, falso si es que a es mayor exclusivo que uno. Y los operadores booleanos, estos son aquí hay que ser una exclusión importante, son estos. Por ejemplo ¿cómo era el operador AND para operar bit por bit? Era simplemente esto. Cuando yo opero con operadores booleanos yo uso doble AND. Entonces por ejemplo yo quiero saber si la condición a es menor que uno y a mayor que menos uno, qué es esto, esto me dice si es que a está básicamente entre menos uno y uno, esto va a ser verdadero y viene siendo que se cumplan las dos condiciones. ¿Qué pasa si es menos tres? Esta se cumple pero esta no. Entonces así opera el operador AND y hay que recordar siempre que se usa con dos letras y no con una sola como en la operación bit por bit. ¿Qué pasa con el OR? De la misma forma que opera el operador AND la sintaxis del OR es con estas dos líneas. Es distinto al símbolo OR que usábamos para las operaciones bit por bit así que siempre que veamos esto, estamos hablando sobre operatorias con variables booleanas y no sobre cada bit. Y también existe el operador NOT que básicamente es negar. Entonces esos son los tres operadores booleanos que vamos a usar para las variables booleanas y recordemos que las variables booleanas son el resultado de una comparación. Nuevamente insisto que esto puede sonar muy enredado, no se preocupen todavía de entenderlo profundamente, en el resto de esta lección vamos a dar ejemplos, vamos a ver para qué sirven en un programa de manera práctica y nos va a quedar un poco más claro todo este tema de las variables booleanas que son fundamentales en cualquier programa. Esto es todo por esta clase, muchas gracias.