Un campo de bits es una estructura de datos utilizada en la programación de computadoras . Consiste en una serie de ubicaciones de memoria de computadora adyacentes que se han asignado para contener una secuencia de bits , almacenada de manera que se pueda direccionar cualquier bit o grupo de bits dentro del conjunto. [1] [2] Un campo de bits se usa más comúnmente para representar tipos integrales de ancho de bits fijo conocido.
El programador determina el significado de los bits individuales dentro del campo; por ejemplo, el primer bit en un campo de bits (ubicado en la dirección base del campo ) a veces se usa para determinar el estado de un atributo particular asociado con el campo de bits. [3]
Dentro de los microprocesadores y otros dispositivos lógicos, las colecciones de campos de bits denominados "banderas" se utilizan comúnmente para controlar o indicar el estado intermedio o el resultado de operaciones particulares. [4] Los microprocesadores suelen tener un registro de estado que se compone de dichos indicadores, que se utilizan para indicar varias condiciones posteriores a la operación, por ejemplo, un desbordamiento aritmético . Las banderas se pueden leer y utilizar para decidir operaciones posteriores, como en el procesamiento de instrucciones de salto condicionales . Por ejemplo, una instrucción (Jump if Equal) en el lenguaje ensamblador x86 resultará en un salto si la bandera Z (cero) fue establecida por alguna operación previa.JE ...
Un campo de bits se distingue de una matriz de bits en que este último se usa para almacenar un gran conjunto de bits indexados por números enteros y, a menudo, es más ancho que cualquier tipo integral admitido por el lenguaje. [ cita requerida ] Los campos de bits, por otro lado, normalmente caben dentro de una palabra de máquina , [3] y la denotación de bits es independiente de su índice numérico. [2]
Implementación
Los campos de bits se pueden usar para reducir el consumo de memoria cuando un programa requiere una cantidad de variables enteras que siempre tendrán valores bajos. Por ejemplo, en muchos sistemas, el almacenamiento de un valor entero requiere dos bytes (16 bits) de memoria; a veces, los valores que se van a almacenar en realidad solo necesitan uno o dos bits. El hecho de que varias de estas pequeñas variables compartan un campo de bits permite un empaquetado eficiente de datos en la memoria. [5]
En C y C ++, los campos de bits nativos definidos por la implementación se pueden crear utilizando unsigned int ,igned int o (en C99 :) _Bool. En este caso, el programador puede declarar una estructura para un campo de bits que etiqueta y determina el ancho de varios subcampos. [6] El compilador puede empaquetar campos de bits del mismo tipo declarados adyacentes en un número reducido de palabras, en comparación con la memoria utilizada si cada "campo" se declarara por separado.
Para lenguajes que carecen de campos de bits nativos, o donde el programador desea un control estricto sobre la representación de bits resultante, es posible manipular manualmente bits dentro de un tipo de palabra más grande. En este caso, el programador puede establecer, probar y cambiar los bits en el campo utilizando combinaciones de operaciones de enmascaramiento y bit a bit . [7]
Ejemplos de
Lenguaje de programación C
Declarar un campo de bits en C y C ++ :
// opaca y muestra #define YES 1 #define NO 0// estilos de línea #define SOLID 1 #define DOTTED 2 #define DASHED 3// colores primarios #define AZUL 0b100 #define GREEN 0b010 #define RED 0b001// colores mezclados #define BLACK 0 / * 000 * /#define AMARILLO (ROJO | VERDE) / * 011 * /#define MAGENTA (ROJO | AZUL) / * 101 * /#define CYAN (VERDE | AZUL) / * 110 * /#define BLANCO (ROJO | VERDE | AZUL) / * 111 * /const char * colors [ 8 ] = { "Negro" , "Rojo" , "Verde" , "Amarillo" , "Azul" , "Magenta" , "Cian" , "Blanco" };// propiedades del cuadro de campo de bits struct BoxProps { unsigned int opaque : 1 ; unsigned int fill_color : 3 ; unsigned int : 4 ; // completar hasta 8 bits unsigned int show_border : 1 ; unsigned int border_color : 3 ; sin firmar int border_style : 2 ; carácter sin firmar : 0 ; // rellenar al byte más cercano (16 bits) ancho de carácter sin signo : 4 , // Dividir un byte en 2 campos de 4 bits de altura : 4 ; };
El diseño de los campos de bits en una C struct
está definido por la implementación . Para un comportamiento que sigue siendo predecible en todos los compiladores, puede ser preferible emular los campos de bits con una primitiva y operadores de bits:
/ * Cada una de estas directivas de preprocesador define un solo bit, correspondiente a un botón en el controlador. El orden de los botones coincide con el de Nintendo Entertainment System. * / #define KEY_RIGHT 0b00000001 #define KEY_LEFT 0b00000010 #define KEY_DOWN 0b00000100 #define KEY_UP 0b00001000 #define KEY_START 0b00010000 #define KEY_SELECT 0b00100000 #define KEY_SELECT 0b00100000 #define KEY_Adeb 0b00000100int gameControllerStatus = 0 ;/ * Establece gameControllerStatus usando OR * / void KeyPressed ( int key ) { gameControllerStatus | = key ; }/ * Apaga la clave en gameControllerStatus usando AND y ~ (binario NOT) * / void KeyReleased ( clave int ) { gameControllerStatus & = ~ key ; } / * Comprueba si un bit está configurado usando AND * / int IsPressed ( int key ) { return gameControllerStatus & key ; }
Registro de estado del procesador
Un ejemplo simple de un registro de estado de campo de bits se incluye en el diseño del procesador 6502 de ocho bits . Un campo de ocho bits contiene siete piezas de información: [9]
- Bit 7. Bandera negativa
- Bit 6. Indicador de desbordamiento
- Bit 5. No utilizado
- Bit 4. Bandera de rotura
- Bit 3. Bandera decimal
- Bit 2. Bandera de interrupción-desactivación
- Bit 1. Bandera cero
- Bit 0. Bandera de transporte
Extrayendo bits de palabras de bandera
Un subconjunto de indicadores en un campo de indicadores se puede extraer mediante AND con una máscara . Además, una gran cantidad de idiomas, debido al uso del operador de turno (<<) al realizar potencia de dos (se (1 << n)
evalúa como) exponenciación, también admiten el uso del operador shift (<<) en combinación con el operador AND (&) para determinar el valor de uno o más bits.
Supongamos que se devuelve el byte de estado 103 (decimal) y que dentro del byte de estado queremos verificar el quinto bit de bandera. La bandera de interés (posición de bit literal 6) es la quinta, por lo que el byte de máscara será. Hacer Y el byte de estado 103 ( 0110 0111
en binario) con el byte de máscara 32 ( 0010 0000
en binario) se evalúa como 32, nuestro byte de máscara original, lo que significa que el bit de bandera está establecido; alternativamente, si no se hubiera establecido el bit de bandera, esta operación se habría evaluado en 0.
Por lo tanto, para verificar el bit n de una variable v , podemos realizar la operación:
bool nth_is_set = ( v & (1 << n ))! = 0;bool nth_is_set = ( v >> n ) & 1;
Cambio de bits en palabras de bandera
La escritura, lectura o alternancia de bits en banderas solo se puede realizar utilizando las operaciones OR, AND y NOT, operaciones que se pueden realizar rápidamente en el procesador. Para establecer un bit, O el byte de estado con un byte de máscara. Los bits establecidos en el byte de máscara o el byte de estado se establecerán en el resultado.
Para alternar un poco, XOR el byte de estado y el byte de máscara. Esto se establecerá un bit si se borra o se borrará un poco si se establece.
Referencias
- ^ Penn Brumm; Don Brumm (agosto de 1988). 80386 Lenguaje ensamblador: un tutorial completo y una biblioteca de subrutinas . Grupo de Educación Escolar McGraw-Hill. pag. 606. ISBN 978-0-8306-9047-3.
- ^ a b Steve Oualline (1997). Programación práctica C . "O'Reilly Media, Inc.". págs. 403 -. ISBN 978-1-56592-306-5.
- ^ a b Michael A. Miller (enero de 1992). La familia de microprocesadores 68000: arquitectura, programación y aplicaciones . Merrill. pag. 323. ISBN 978-0-02-381560-7.
- ^ Ian Griffiths; Matthew Adams; Jesse Liberty (30 de julio de 2010). Programación C # 4.0: Creación de aplicaciones Windows, Web y RIA para .NET 4.0 Framework . "O'Reilly Media, Inc.". págs. 81–. ISBN 978-1-4493-9972-6.
- ^ Tibet Mimar (1991). Programación y diseño con la familia 68000: incluidos 68000, 68010/12, 68020 y 68030 . Prentice Hall. pag. 275. ISBN 978-0-13-731498-0.
- ^ Prata, Stephen (2007). C primer plus (5ª ed.). Indianápolis, Indiana: Sams. ISBN 978-0-672-32696-7.
- ^ Mark E. Daggett (13 de noviembre de 2013). JavaScript experto . Presione. págs. 68–. ISBN 978-1-4302-6097-4.
- ^ Prata, Stephen (2007). C primer plus (5ª ed.). Indianápolis, Indiana: Sams. ISBN 978-0-672-32696-7.
- ^ InCider . W. Green. Enero de 1986. p. 108.
Ver también
- Código binario
- Bitboard , utilizado en ajedrez y juegos similares.
- Matriz de bits (o cadena de bits)
- Word (arquitectura informática)
- Máscara (informática)
- Palabra de estado del programa
- Registro de estado
- Registro BANDERAS (informática)
- Registro de control
enlaces externos
- Explicación de un libro
- Descripción de otra wiki
- Caso de uso en una guía de C ++
- Biblioteca de bits libbit de C ++ ( URL alternativa )