stringtranslate.com

campo de bits

Un campo de bits es una estructura de datos que consta de uno o más bits adyacentes que han sido asignados para propósitos específicos, de modo que cualquier bit o grupo de bits dentro de la estructura pueda configurarse o inspeccionarse. [1] [2] Un campo de bits se utiliza más comúnmente para representar tipos integrales de ancho de bits fijo conocido, como los booleanos de un solo bit .

El significado de los bits individuales dentro del campo lo determina el programador; 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 las CPU y otros dispositivos lógicos, se utilizan comúnmente colecciones de campos de bits llamados indicadores para controlar o indicar el resultado de operaciones particulares. [4] Los procesadores tienen un registro de estado que se compone de banderas. Por ejemplo, si el resultado de una suma no se puede representar en el destino, se establece un desbordamiento aritmético . Las banderas se pueden utilizar para decidir operaciones posteriores, como instrucciones de salto condicional . Por ejemplo, una instrucción (Saltar si es igual) en el lenguaje ensamblador x86 dará como resultado un salto si alguna operación anterior estableció el indicador Z (cero) .JE ...

Un campo de bits se distingue de una matriz de bits en que este último se utiliza para almacenar un gran conjunto de bits indexados por números enteros y, a menudo, es más amplio que cualquier tipo integral admitido por el lenguaje. [ cita necesaria ] Los campos de bits, por otro lado, normalmente encajan 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 utilizar 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, almacenar un valor entero requiere dos bytes (16 bits) de memoria; a veces los valores a almacenar en realidad sólo necesitan uno o dos bits. Hacer que varias de estas pequeñas variables compartan un campo de bits permite empaquetar eficientemente los datos en la memoria. [5]

En C, los campos de bits nativos definidos por la implementación se pueden crear usando int, [a] unsigned int , signed int, _Bool(en C99), _BitInt(N), unsigned _BitInt(N)(en C23) u otros tipos definidos por la implementación. En C++, se pueden crear utilizando cualquier tipo integral o de enumeración; la mayoría de los compiladores de C también lo permiten. 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 adyacentemente 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 controlar la representación de bits resultante, es posible manipular manualmente los bits dentro de un tipo de palabra más grande. En este caso, el programador puede configurar, probar y cambiar los bits en el campo usando combinaciones de enmascaramiento y operaciones bit a bit . [7]

Ejemplos

lenguaje de programación c

Declarar un campo de bits en C y C++ : [6]

// opaco y muestra #define SÍ 1 #define NO 0// estilos de línea #definir SÓLIDO 1 #definir PUNTO 2 #definir DISPONIBLE 3// colores primarios #definir AZUL 0b100 #definir VERDE 0b010 #definir ROJO 0b001// colores mezclados #define NEGRO 0 /* 000 */ #define AMARILLO (ROJO | VERDE) /* 011 */ #define MAGENTA (ROJO | AZUL) /* 101 */ #define CIAN (VERDE | AZUL) /* 110 */ #define BLANCO (ROJO | VERDE | AZUL) /* 111 */const char * colores [ 8 ] = { "Negro" , "Rojo" , "Verde" , "Amarillo" , "Azul" , "Magenta" , "Cian" , "Blanco" };           // propiedades del cuadro de campo de bits estructura BoxProps { unsigned int opaque : 1 ; sin firmar int fill_color : 3 ; int sin firmar : 4 ; // rellenar hasta 8 bits unsigned int show_border : 1 ; sin firmar int border_color : 3 ; sin firmar int border_style : 2 ; carácter sin firmar : 0 ; // rellenar hasta el byte más cercano (16 bits) ancho de carácter sin signo : 4 , // Dividir un byte en 2 campos de 4 bits de alto : 4 ; };                                             


El diseño de los campos de bits en C structestá definido por la implementación . Para que el comportamiento siga siendo predecible entre compiladores, puede ser preferible emular 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. */ #definir KEY_RIGHT 0b00000001 #definir KEY_LEFT 0b00000010 #definir KEY_DOWN 0b00000100 #definir KEY_UP 0b00001000 #definir KEY_START 0b00010000 #definir KEY_SELECT 0b00100000 #definir KEY_B 0 b01000000 #definir KEY_A 0b10000000carácter sin firmar gameControllerStatus = 0 ;    /* Establece gameControllerStatus usando OR */ void KeyPressed ( tecla de carácter sin firmar ) { gameControllerStatus |= clave ; }         /* Borra gameControllerStatus usando AND y ~ (binary NOT)*/ void KeyReleased ( unsigned char key ) { gameControllerStatus &= ~ key ; }         /* Comprueba si un bit está configurado usando AND */ unsigned char IsPressed ( unsigned char key ) { return gameControllerStatus & key ; }           

Registro de estado del procesador

El registro de estado de un procesador es un campo de bits que consta de varios bits de bandera. Cada bit de bandera describe información sobre el estado actual del procesador. [8] Como ejemplo, el registro de estado del procesador 6502 se muestra a continuación:

Estos bits los establece el procesador tras el resultado de una operación. Ciertos bits (como los indicadores Carry, Interrupt-Disable y Decimal) se pueden controlar explícitamente mediante instrucciones establecidas y claras. Además, las instrucciones de bifurcación también se definen para alterar la ejecución según el estado actual de un indicador.

Por ejemplo, después de una ADCinstrucción (Agregar con acarreo), la BVSinstrucción (Branch on oVerflow Set) se puede usar para saltar en función de si el procesador estableció el indicador de desbordamiento después del resultado de la instrucción de suma.

Extraer bits de palabras bandera

Se puede extraer un subconjunto de indicadores en un campo de indicador aplicando AND con una máscara . Una gran cantidad de idiomas admiten el operador de desplazamiento (<<) donde 1 << nalinea un solo bit en la enésima posición. La mayoría también admite el uso del operador AND (&) para aislar el valor de uno o más bits.

Si el byte de estado de un dispositivo es 0x67 y el quinto bit de bandera indica que los datos están listos. El byte de máscara es 2^5 = 0x20. La combinación AND del byte de estado 0x67 ( 0110 0111en binario) con el byte de máscara 0x20 ( 0010 0000en binario) se evalúa como 0x20. Esto significa que el bit de bandera está configurado, es decir, el dispositivo tiene datos listos. Si el bit de bandera no se hubiera configurado, se habría evaluado a 0, es decir, no hay datos disponibles desde el dispositivo.

Para verificar el enésimo bit de una variable v , realice cualquiera de las siguientes acciones: (ambos son equivalentes)

bool nth_is_set = ( v & (1 << n )) != 0;bool nth_is_set = ( v >> n ) & 1;

Cambiar bits en palabras de bandera

Escribir, leer o alternar bits en banderas sólo se puede hacer usando 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. Cualquier bit establecido en el byte de máscara o en el byte de estado se establecerá en el resultado.

Para alternar un poco, haga XOR el byte de estado y el byte de máscara. Esto se establecerá un bit si se borra o se borrará un bit si se establece.

Ver también

Notas

  1. ^ En C, la implementación define si un campo de bits de tipo int está firmado o no. En C++, siempre está firmado para que coincida con el tipo subyacente.

Referencias

  1. ^ 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.
  2. ^ ab Steve Oualline (1997). Programación práctica en C. "O'Reilly Media, Inc.". págs. 403–. ISBN 978-1-56592-306-5.
  3. ^ ab Michael A. Miller (enero de 1992). La familia de microprocesadores 68000: arquitectura, programación y aplicaciones. Merril. pag. 323.ISBN _ 978-0-02-381560-7.
  4. ^ Ian Griffiths; Mateo 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.
  5. ^ Tíbet 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.
  6. ^ ab Prata, Stephen (2007). C primer plus (5ª ed.). Indianápolis, Indiana: Sams. ISBN 978-0-672-32696-7.
  7. ^ Mark E. Daggett (13 de noviembre de 2013). JavaScript experto. Presione. págs.68–. ISBN 978-1-4302-6097-4.
  8. ^ En sidra. W. verde. Enero de 1986. pág. 108.

enlaces externos