Herramientas de usuario

Herramientas del sitio


bits

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
bits [2016/04/04 02:24] – [Máscaras de bits] lmateubits [2018/03/22 12:57] (actual) – [Ejemplo 2: extracción de bits] lmateu
Línea 117: 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<sub>0</sub> x<sub>1</sub> x<sub>2</sub> ... x<sub>30</sub> x<sub>31</sub> Por razones de eficiencia de uso de la memoria se han colocado varios enteros de pequeño tamaño en el entero x.  Por ejemplo, un entero podría estar codificado en los 12 bits ubicadoes en x<sub>8</sub> ... x<sub>19</sub> Entonces se necesita programar la función extract(x, i, k) que entrega los bits x<sub>i</sub> ... x<sub>i+k-1</sub> de x, con %%0<=i<=31%% y %%0<k<=32-i%%  Por ejemplo extract(0x**0**48b6048, 0, 4) es 0 y extract(0x04**8b6**048, 8, 12) es 0x8b6.+Supongamos que un entero sin signo x está formado por x<sub>0</sub> x<sub>1</sub> x<sub>2</sub> ... x<sub>30</sub> x<sub>31</sub> Por razones de eficiencia de uso de la memoria se han colocado varios enteros de pequeño tamaño en el entero x.  Por ejemplo, un entero podría estar codificado en los 12 bits ubicados en x<sub>8</sub> ... x<sub>19</sub> Entonces se necesita programar la función extract(x, i, k) que entrega los bits x<sub>i</sub> ... x<sub>i+k-1</sub> de x, con %%0<=i<=31%% y %%0<k<=32-i%% Por ejemplo extract(0x**0**48b6048, 0, 4) es 0 y extract(0x04**8b6**048, 8, 12) es 0x8b6.
  
 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 ''%%(1<<j)-1%%'' El problema es que esto no funcionaría en x86 si j=32 porque en este procesador %%1<<32%% es 1, no 0 como uno esperaría.  Por lo tanto se debe considerar como un caso de borde.  Esta sería la función: 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 ''%%(1<<j)-1%%'' El problema es que esto no funcionaría en x86 si j=32 porque en este procesador %%1<<32%% es 1, no 0 como uno esperaría.  Por lo tanto se debe considerar como un caso de borde.  Esta sería la función:
Línea 145: 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<<i) >> (32-k);   return (x<<i) >> (32-k);
 +}
 +</code>
 +
 +y por último:
 +
 +<code>
 +unsigned int extract(unsigned int x, int i, int k) {
 +  return (  x & ( ((unsigned)-1)>>i ) ) >> (32-i-k);
 } }
 </code> </code>
bits.1459736646.txt.gz · Última modificación: 2016/04/04 02:24 por lmateu