Paso 3: Operaciones bit a bit
Puertos con mezcla de entradas y salidas, como en la tabla 1, a menudo requieren enmascarar operaciones que consisten en una máscara y una operación bit a bit [16]. El enmascaramiento permite seleccionar bits individuales o un subconjunto de bits de puerto para la prueba. Las operaciones bit a bit permiten las operaciones de enmascaramiento. De esta manera, los bits de entrada y salidos de un puerto de IO pueden ser separados y manipulados.
Considere unos pocos ejemplos ilustrativos que se utilizará con dos Blinky. Estos ejemplos escribir y manipular los bits de una variable de 8 bits dado por un = rstuvwxy donde las letras r, s, t,..., y son bits con valores de 0 o 1. Por ejemplo, A = 10001000 significa que r = 1 y v = 1 y el resto son cero. Sin embargo, estamos trabajando con el general A y no se han asignado valores a r, s,..., y. En notación de tipo C, se puede escribir A = '0brstuvwxy' donde 0b dice que el compilador el número es binario; sin embargo, esta notación no funcionará en un programa.
1. bit a bit 'y' representado por el símbolo '&'
Considerar la A variable de 8 bits = rstuvwxy. Supongamos que queremos comprobar el valor de bit #1 (no bit #0). ¿Es x = 0 o es x = 1? Así definimos la máscara = 00000010. Nota el 1 valor en la posición de la broca #1 que corresponde a la posición de la broca en A variable que se desea comprobar. La palabra máscara pretende implica que algunos bits se eliminará de la consideración y otros destacan para su consideración. Ahora, consideremos el poco a poco lógica y operación representan por '&'. Tener en cuenta
Prueba = A & máscara.
La tabla 2 muestra los bits de A, la máscara y el resultado de un anuncio de y. poco a poco la columna derecha de la tabla representa bit #0, que es también el menos significativo bit.
Tabla 2: Ejemplo del AND bit a bit entre dos variables de 8 bits
A variable | r | s | t | u | v | w | x | y |
Máscara | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Prueba = A & la máscara | 0 | 0 | 0 | 0 | 0 | 0 | x | 0 |
El operador '&' es esencialmente multiplicación de poco a poco con las siguientes definiciones de 1 & 1 = 1, 0 y 1 = 0, 1 y 0 = 0, 0 y 0 = 0, que puede considerarse equivalente a álgebra booleana o lógica aristotélica con 1 = True y 0 = False. Los dos primeros de los productos (en concreto, 1 & 1 = 1, 0, 1 = 0) muestra la razón x y 1 = x en la tabla 2. Esta es la propiedad que tenemos para enmascarar con el '&' desde todos los bits en la 'Variable' se asigna a cero excepto aquellos donde la máscara tiene un 1. Ver referencia [16] para más información sobre las operaciones bit a bit. Ahora podemos preguntar si 'Test' es igual a cero. Si prueba = 0 entonces x debe ser cero.
2. bit a bit OR representado por la línea vertical ' |'
Una vez más, considerar la variable A = rstuvwxy donde están..., y representan bits con valores de 0 ó 1. Supongo que esta vez queremos Asegúrese de que bits #0 y #4 tienen el valor de 1 sin cambiar ninguno de los otros en el A. Es decir, queremos establecer y = 1 y = 1. Para ello, consideremos una máscara con cero todos los bits excepto #0 y #4.
Mask2 = 00010001
La operación de enmascaramiento en este caso será la operación OR de bit por bit representada por la línea vertical. El o tiene el efecto siguiente en bits: 1 | 1 = 1, 0 | 1 = 1, 1 | 0 = 1, 0 | 0 = 0. O puede verse similar a la o en el sistema de la lógica aristotélica con 1 = True y 0 = False. La tabla 3 muestra la operación de un | Mask2.
Tabla 3: Ejemplo de la operación OR bit a bit entre dos números de 8 bits
A Variable de 8 bits | r | s | t | u | v | w | x | y |
Mask2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
A | Mask2 | r | s | t | 1 | v | w | x | 1 |
Las dos definiciones de la OR de 1 | 0 = 1, 0 | 0 = 0 (es decir, equivalente x | 0 = x) muestran que los bits de máscara en el cuadro 3 que son cero no cambian los bits correspondientes en la Variable (ver bits r-t, v-x) al calcular Variable| Mask2 en la fila inferior. Pero la OR bit a bit sin duda produce un 1 en el bit de resultado donde la máscara tiene un 1 como para usted y y en la tabla.
Por último entonces, si le asignamos el resultado de ' A | Mask2' a una (usando el operador de asignación de C y C++ de '='), es decir, A = A | Mask2, entonces llegaremos el resultado deseado de bits de valor 0 y 4 con el valor uno.
3. nivel de bit se representan por élite ~
Una vez más, considerar la variable A = rstuvwxy donde están..., y representan bits con valores de 0 ó 1. Supongo que esta vez queremos Asegúrese de que bits #0 y #4 tienen el valor de 0 sin cambiar ninguno de los otros en el A. Es decir, queremos establecer y = 0 y = 0. Para ello, consideremos una máscara con cero todos los bits excepto #0 y #4.
Mask3 = 00010001
convenientemente que pasa a ser el mismo que Mask2 en el ejemplo anterior. Podría ser más fácil de ver en la tabla 4 para ver lo que debe suceder.
Tabla 4: Ejemplo del AND bit a bit entre dos números de 8 bits
Variable de 8 bits | r | s | t | u | v | w | x | y |
Mask3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
~ Mask3 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Variable & ~ Mask3 | r | s | t | 0 | v | w | x | 0 |
Sabemos por los ejemplos anteriores, OR se puede utilizar para cambiar un poco a un 1 y eso y se puede utilizar para cambiar un poco a un cero. Así que parece que necesitamos la y. Como se muestra en la tabla 4, Mask3 tiene un 1 en esos lugares que el resultado tiene un 0. Para combinar el Mask3 con la y, tenemos una lluvia de ideas y darse cuenta de que sólo tenemos que voltear los bits en Mask3 y luego aplicar la y.
El no lógico o negación tiene la siguiente definición ~ 0 = 1, ~ 1 = 0. Así que ahora la broca posiciones en ~ Mask3 (ver tabla 4) con un 0 son las posiciones de la variable A que debe ajustarse a cero. Utilizando los resultados para el primer ejemplo y el hecho de y & 0 = 0 (etc) llegamos a la línea inferior de la tabla 4. Si almacenamos el resultado en variable A según
A = A & ~ Mask3
entonces hemos terminado nuestra tarea de poco ajuste #0 y #4 a cero en el número original. Aquí están usando el '=' como una asignación de C y C++.