Fecha actual Dom Ago 25, 2019 9:48 pm

Obtener la posición de un bit dentro de un buffer de bytes

Discusión de problemas matemáticos de una manera adecuada para ser fácilmente implementados en programas de computadora.


Usuarios leyendo este tema: Ninguno

Obtener la posición de un bit dentro de un buffer de bytes

Notapor ~ » Vie Feb 06, 2015 11:51 am

A veces deseamos mantener un conjunto de banderas booleanas, u otros tipos de campos puramente de bits, en un arreglo de bytes de 8 bits, en los que cada bit representa una condición VERDADERA (1) o FALSA (0).

Por ejemplo, queremos saber si un sector de un floppy se ha cargado ya a la memoria o no. Para esto, aparte del buffer que contendrá los datos del floppy (2880 sectores multiplicado por 512 bytes por sector), desearemos también mantener un buffer de 2880 bits (en 360 bytes) para indicar si ya se cargó cada sector o no.

Para obtener el número del byte y la posición dentro de ese byte que representa el sector deseado (en este ejemplo, de 0 a 2879), necesitaremos las siguientes fórmulas básicas para comenzar:
Código: Seleccionar todo
Tamaño_Byte=8;

Offset_Byte=Numero_Bit / Tamaño_Byte;

Offset_Bit=Numero_Bit % Tamaño_Byte;





Ahora necesitamos obtener el byte indicado en Offset_Byte, y desplazarlo a la derecha el número de bits indicado por Offset_Bit, y aplicar AND con 1 (para obtener solo el ahora bit de menor peso). Con esto obtenemos el bit correspondiente a cualquier bandera booleana en este buffer de bytes.


Si deseamos escribir la bandera, primero debemos establecer a 1 o a 0 un byte en limpio (a cero), y luego desplazarlo a la izquierda el número de bits indicado por Offset_Bit. Ahora necesitamos una copia negada de este valor que usaremos para aplicar AND con el valor actual indicado por Offset_Byte (para limpiar el estado del bit). Una vez limpiado el estado actual del bit, aplicamos OR junto con el valor actual en la posición indicada por Offset_Byte. Con esto habremos modificado el valor de esa bandera.


Esta es toda la lógica básica para modificar un buffer de banderas booleanas que ocupa uno o más bytes.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Volver a Matemática para Programadores

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados


cron