bits
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| bits [2014/08/05 04:32] – [Operadores de bits] lmateu | bits [2018/03/22 12:57] (actual) – [Ejemplo 2: extracción de bits] lmateu | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ===== Operaciones con bits ===== | + | ====== Operaciones con bits ====== |
| - | Los enteros se almacenan internamente en binario. Por ejemplo: | ||
| - | (2001)< | + | ===== Operadores de bits ===== |
| - | = 2< | + | |
| - | = 1024+512+256+128+64+16+1 | + | |
| - | + | ||
| - | Aunque la representación interna sea en binario, el lenguaje C permite escribir los número en notación | + | |
| - | decimal, octal y hexadecimal. | + | |
| - | + | ||
| - | Un número octal siempre comienza con un 0 y cada cifra representa 3 bits: | + | |
| - | + | ||
| - | (2001)< | + | |
| - | + | ||
| - | ¡Cuidado! | + | |
| - | Es decir: | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | Un número en hexadecimal siempre comienza con el prefijo 0x y cada cifra representa 4 bits: | + | |
| - | + | ||
| - | (2001)< | + | |
| - | + | ||
| - | ==== Operadores de bits ==== | + | |
| ^ Símbolo ^ Función ^ latencia (ciclos) ^ significado ^ | ^ Símbolo ^ Función ^ latencia (ciclos) ^ significado ^ | ||
| Línea 36: | Línea 15: | ||
| reloj. | reloj. | ||
| - | === Máscaras de bits === | + | ===== Máscaras de bits ===== |
| Los operadores ''&'' | Los operadores ''&'' | ||
| * x & MASK : borra aquellos bits de x que en la máscara MASK aparezcan en 0. | * x & MASK : borra aquellos bits de x que en la máscara MASK aparezcan en 0. | ||
| - | * x | MASK : colocar en 1 los bits de x que en MASK aparezcan en 0. | + | * x | MASK : colocar en 1 los bits de x que en MASK aparezcan en 1. |
| Por conveniencia se usan números hexadecimales para expresar las máscaras. | Por conveniencia se usan números hexadecimales para expresar las máscaras. | ||
| Línea 66: | Línea 45: | ||
| el operador |. | el operador |. | ||
| - | === Desplazamientos === | + | ===== Desplazamientos |
| El desplazamiento a la izquierda se puede usar para multiplicar eficientemente por una potencia de 2. Por ejemplo '' | El desplazamiento a la izquierda se puede usar para multiplicar eficientemente por una potencia de 2. Por ejemplo '' | ||
| Línea 72: | Línea 51: | ||
| El desplazamiento a la derecha se puede usar para dividir eficientemente por una potencia de 2. Por ejemplo '' | El desplazamiento a la derecha se puede usar para dividir eficientemente por una potencia de 2. Por ejemplo '' | ||
| - | La duda se produce porque si uno desplaza -2 en 1 bit hacia la derecha rellenando con un 0 a la izquierda, el resultado pasa a ser positivo, lo que no daría -1. La explicación de por qué no sucede esto está en que cuando se usa un desplazamiento a la derecha de un entero con signo, no se rellena con 0, si nó que con el bit de signo. | + | La duda se produce porque si uno desplaza -2 en 1 bit hacia la derecha rellenando con un 0 a la izquierda, el resultado pasa a ser positivo, lo que no daría -1. La explicación de por qué no sucede esto está en que cuando se usa un desplazamiento a la derecha de un entero con signo, no se rellena con 0, si no que con el bit de signo. |
| - | Entonces cuando el tipo de la expresión a desplazar a la derecha es unsigned, entonces siempre se rellena con 0s a la izquierda. | + | Entonces cuando el tipo de la expresión a desplazar a la derecha es unsigned, entonces siempre se rellena con 0s a la izquierda. |
| - | === Ejemplo 1: conjuntos con mapas de bits === | + | ^ tipo operando ^ operación ^ resultado ^ |
| + | | con o sin signo | %%x << 1%% | x< | ||
| + | | sin signo | %%x >> 1%% | 0 x< | ||
| + | | con signo | %%x >> 1%% | x< | ||
| + | |||
| + | ===== Ejemplo 1: conjuntos con mapas de bits ===== | ||
| < | < | ||
| Línea 131: | Línea 115: | ||
| * Defina otra operación para la diferencia de conjuntos | * Defina otra operación para la diferencia de conjuntos | ||
| - | === Ejemplo 2: extracción de bits === | + | ===== Ejemplo 2: extracción de bits ===== |
| - | Supongamos que un entero sin signo x está formado por x< | + | Supongamos que un entero sin signo x está formado por x< |
| - | Como etapa previa necesitaremos de una función que entregue una máscara con los i bits menos significativos en 1. Una forma errada de hacerlo sería calculando %%(1<< | + | Como etapa previa necesitaremos de una función que entregue una máscara con los j bits menos significativos en 1. Por ejemplo si j=4 la máscara sería 00...001111. Una forma errada de hacerlo sería calculando |
| < | < | ||
| - | unsigned mascara(unsigned | + | unsigned mascara(unsigned |
| - | return | + | return |
| } | } | ||
| </ | </ | ||
| Línea 161: | Línea 145: | ||
| unsigned int extract(unsigned int x, int i, int k) { | unsigned int extract(unsigned int x, int i, int k) { | ||
| return (x<< | return (x<< | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | y por último: | ||
| + | |||
| + | < | ||
| + | unsigned int extract(unsigned int x, int i, int k) { | ||
| + | return ( x & ( ((unsigned)-1)>> | ||
| } | } | ||
| </ | </ | ||
| Línea 168: | Línea 160: | ||
| Programe en el computador la parte b de la pregunta 1 del [[http:// | Programe en el computador la parte b de la pregunta 1 del [[http:// | ||
| - | ==== Otros Ejercicios ==== | + | ===== Otros Ejercicios |
| La idea en estos ejercicios es resolverlos haciendo un manejo eficientes de bits por medio de los operadores | La idea en estos ejercicios es resolverlos haciendo un manejo eficientes de bits por medio de los operadores | ||
bits.1407213142.txt.gz · Última modificación: por lmateu
