Usando tipos enumerados como Bitflags (1 / 3 paso)

Paso 1: antecedentes

El uso de indicadores de bits va camino hacia atrás a los primeros días de programación en C. La idea es realmente muy simple. De valor en lugar de utilizar un número entero singular como un valor booleano (true o false o uno o cero), se puede utilizar cada uno de los bits dentro del entero como una bandera propios. Esto sólo funciona si sus parámetros son valores booleanos naturalmente, pero por suerte, en la programación muchas veces son.

Por ejemplo, podríamos declarar un entero de 8 bits como una bandera para mostrar algunas instrucciones o no o no:

unsigned char DISPLAY_INSTRUCTIONS = 1;

Utilizando un valor de 8 bits nos permitiría tener 28 valores posibles, o 256 banderas únicas. Cada bandera sería tomar un byte de los recursos, ya sea en disco o en base de la RAM. También podríamos utilizar otros valores estándar para la bandera como uint16_t, un valor de 16 bits almacenar banderas únicas hasta 65.535, probablemente mucho más de lo que podríamos necesitar o utilice. Pero ¿qué pasa si sólo teníamos, dice, 6 banderas que necesitábamos para seguir? En el esquema anterior se requeriría de seis bytes, un byte para cada bandera, pero usando bits podríamos almacenamos todas las seis banderas (y algunos) dentro de un solo byte.

Si usted está familiarizado con números binarios, podría tomar un momento y lea mi instructable sobre bases de número, que incluye el binario o encontrar una serie de tutoriales en línea. Supondré que ya tienes un paso conocimiento de números binarios cómo se ponen juntos. Así, usted puede preguntar ¿cómo uno utiliza los bits individuales dentro de un número entero como una bandera para el uso en software de código? Por lo general, esto se hace asignando un poco a "1" o "0" y basado en su ubicación dentro de los enteros, se puede utilizar para una afirmación o una negación del valor especificado. Por ejemplo, tomar un 8-bit número, digamos, cero y lo mira.

0000 0000

OK, nada emocionante aquí. Ahora en la posición de la 1, que sea 1:

0000 0000

Podemos hacer lo mismo para la ubicación de los dos:

0000 0010

o en lugar de cuatro:

0000 0100

o tal vez el 32 y 8 Ubicación:
0010 1000

¿Qué números de hacer estos tirones de bit? No nos importa. Nos estamos sólo preocupados por los bits individuales dentro de la cantidad en este caso. Para asignar fácilmente valores de indicador a bits, es común utilizar el idioma siguiente:

#define FLAG1 0x01 // 0000 0001
#define FLAG2 0x02 // #define FLAG1 0x01 // 0000 0001
 #define FLAG2 0x02 // 0000 0010
 #define FLAG3 0x04 // 0000 0100
 #define FLAG4 0x08 // 0000 1000
 #define FLAG5 0x10 // 0001 0000
 #define FLAG6 0x20 // 0010 0000
 #define FLAG7 0x40 // 0100 0000
 #define FLAG8 0x80 // 1000 0000
#define FLAG3 0x04 // unsigned char myFlags = 0x00; myFlags |= FLAG5;
#define FLAG4 0x08 // 0000 1000
#define FLAG5 0x10 // 0001 0000
#define FLAG6 0x20 // 0010 0000
#define FLAG7 0x40 // 0100 0000
#define FLAG8 0x80 // 1000 0000

Allí hemos definido nuestras banderas. Tomar nota del patrón en el número hexadecimal y su representación binaria. Por lo tanto, si es FLAG5, entonces la bandera entero habría poco 5 conjunto (utilizando un índice basado en 1, contrario a la más común basado en 0, pero no es importante para nosotros ahora mismo). Crear la variable bandera y configurar FLAG5 tiene este aspecto:

myFlags &= ~FLAG3;

Nos o las banderas por lo que cualquier banderas existentes se mantienen conservan. Si usted y las banderas, usted tendrá que escribir sobre cualquier banderas existentes con la máscara de bits el ANDing que. Esto es útil cuando desea borrar una bandera:

#define FLAG28 0x00400000

Conjuntos anteriores FLAG3 a cero. Aviso que son ANDing con el complemento de la bandera.
Pero qué pasa si usted tiene:

#define FLAG_1 0x01
 #define FLAG_2 0x02
 #define FLAG_3 0x04
 #define FLAG_4 0x08
 ...
 uint32_t _flags;
 // set a flag
 _flags |= FLAG_2;
 // clear a flag
 _flags &= ~FLAG_3;
 // test bit flag
 if (_flags & FLAG_4)
 do_something();

¿y se intenta establecer con nuestro entero de 8 bits? Tendrás un rebosadero con tamaños de enteros no coinciden y sale un error, probablemente en tiempo de ejecución y tiempo de compilación no porque el compilador será generalmente promover o de lo contrario convertir implícitamente su bandera constante en el tipo que está siendo operado en. Esto no es siempre el caso, pero a menudo es. Esto puede crear duro atrapar insectos y la peor clase: errores de tiempo de ejecución. Son malos porque pueden ser más difíciles de rastrear, más difícil de replicar e introducido a los usuarios, que no quieres hacer en la medida de lo posible.

¿Además, lo que si es necesario una nueva bandera, decir, FLAG9 pero con el valor 0x0080 por cualquier motivo? Tienes 1) extender su bandera tipo para acomodar el tamaño más grande y 2) Inserte la bandera en sus declaraciones de bandera y numerar todas las banderas detrás de él. Eso simplemente no es factible y definitivamente no.

¿Qué hacer acerca de estos problemas? ¿Cómo garantizar seguridad de tipos y extensibilidad a nuestras banderas? Dar vuelta la página y descúbrelo!

Artículos Relacionados

Usando el LM386 como un oscilador.

Usando el LM386 como un oscilador.

Mayoría de la gente sabe el LM386 como un amplificador mono. Lo que puede sorprender a algunas personas es que el LM386 puede también fácilmente convertirse en un oscilador sin cualquier otro específico de IC como el chip 555 temporizador común.En es
Usando la PSP como Joystick de PC y luego controlar su ordenador con la PSP

Usando la PSP como Joystick de PC y luego controlar su ordenador con la PSP

puede hacer muchas cosas interesantes con el homebrew de la PSP y en este instructable va de la cam para enseñarte a utilizar tu PSP como joystick para jugar juegos, pero también hay un programa que te permite usar tu joystick como el ratón.Aquí está
Usando Arduino UNO como DAC de alta resolución 3-CH

Usando Arduino UNO como DAC de alta resolución 3-CH

En esta aplicación, daremos una demostración sobre cómo construir una fuente de alimentación de alta precisión utilizando el DAC 3000 y una fuente de referencia de alta precisión REF4096.STEP1:List de MaterialDirección de la tienda de eBay:BUONO UNO
Usando el cubo como un soporte de taladro

Usando el cubo como un soporte de taladro

Un cubo de café Folgers puede transformarse en un soporte para un taladro portátil cuando se trabaja en un proyecto y cuando está poniendo en almacenamiento que puede ser colgado en un gancho en la pared. Con la adición de una manija hecha de una per
Usando un LED como indicador para diferentes eventos en su sistema - Arduino

Usando un LED como indicador para diferentes eventos en su sistema - Arduino

Muchos sistemas o máquinas se someten a diferentes eventos. Por ejemplo, cuando usted enciende su ordenador portátil, un LED se enciende para mostrar poder sobre eventos de estado. Otro LED se enciende cuando se conecta en su cargador; este otro LED
Como subir códigos a Lilypad Arduino sin FTDI con usando Arduino Uno

Como subir códigos a Lilypad Arduino sin FTDI con usando Arduino Uno

Hoy, voy a demostrarte que yo había diseñado un problema con mi módulo FTDI mientras estoy tratando de subir a cualquiera - en el IDE de Arduino - códigos desde mi computadora a la placa Lilypad Arduino Atmega328.En realidad, debe utilizar los módulo
101 + Hacks de vida usando los palillos

101 + Hacks de vida usando los palillos

¿Piensa en palillos son sólo para los países del este? CREO QUE OTRA VEZ :)Aquí hay 101 + increíbles (e inusuales) cosas que puedes con los palillos en la cocina, comedor, garaje/taller, "Cueva de hombre", oficina, casa cuarto de baño, bibliotec
Como soldadura sin electricidad (o un soldador)

Como soldadura sin electricidad (o un soldador)

Soldar es una habilidad valiosa. Hay un montón de situaciones donde la capacidad de reparar o modificar electrónica realmente puede salvar el día. Pero la mayoría de las personas no lleva un cautín alrededor con ellos. Y aunque contaba con un soldado
Como ver DVDs en un Netbook

Como ver DVDs en un Netbook

este instructivo puede consultarse en la web del autor - http://www.neatinformation.com/Si usted enlace a este instructable desde otro sitio web, por favor incluya un enlace a la Web de Información aseado .Netbooks son extremadamente ligeros y relati
Persianas automatización usando un LinkIt

Persianas automatización usando un LinkIt

Automatización de persianas, es un proyecto de fin de semana, usted puede poner juntos usando plataforma Mediatek LinkIt uno y 3D impreso piezas para que los archivos STL se unen en el paso 2.Para girar la varilla/barra ciega vamos a utilizar un serv
IoT gráficos usando las herramientas de Google: Introducción

IoT gráficos usando las herramientas de Google: Introducción

La revolución de internet conectado sensor está aquíSe está haciendo más fácil todos los días conecta su proyecto Arduino, Raspberry Pi,ESP8266, Edisono fotón a internet y datos de medición del sensor a una base de datos de nube como ThingSpeak o Dat
Como usar LightScribe y etiqueta tus discos!

Como usar LightScribe y etiqueta tus discos!

Hola, acabo de hacer mi primer disco mediante LightScribe.  Es muy fácil de hacer y da resultados perfectos!  Este es mi primer real Instructable, he tenido otros tres pero quité porque sólo había acometido a través de ellos.  Por favor comenten y pu
Como hacer una katana de prop(wood) y de la envoltura

Como hacer una katana de prop(wood) y de la envoltura

Ahora, no estoy totalmente seguro si es igual en todas partes, pero por lo menos en el con que me he ido a, llevando espadas de metal está prohibido, o, si se permite, está prohibido desenvainar espadas de metal, tiempo tienen borde o no.Además, seam
Cómo hablar a alguien usando el Ham Radio

Cómo hablar a alguien usando el Ham Radio

Radio de jamón es genial, pero puede ser muy nervio wracking para hablar con alguien uso. Hablarle a alguien usando la radio de jamón se conoce comúnmente como 'QSO' o un 'contacto'. Aunque puede parecer realmente asustadizo al principio, no te arrep