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/06 16:18] – 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 ====== | ||
- | ===== Representación de números en binario ===== | ||
- | |||
- | (Esta sección se borrará de esta página porque se movió al sistema de tipos.) | ||
- | |||
- | Los enteros se almacenan internamente en binario. Por ejemplo: | ||
- | |||
- | (2001)< | ||
- | = 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 ===== | ===== Operadores de bits ===== | ||
Línea 45: | Línea 20: | ||
* 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 76: | 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. |
^ tipo operando ^ operación ^ resultado ^ | ^ tipo operando ^ operación ^ resultado ^ | ||
Línea 142: | Línea 117: | ||
===== 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 '' | + | 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 170: | 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)>> | ||
} | } | ||
</ | </ |
bits.1407341892.txt.gz · Última modificación: 2014/08/06 16:18 por lmateu