¿Cuántas opciones puedo incluir en una máscara de bits?

In esta pregunta se señaló que:

Usar int [para la máscara de bits] está buscando problemas

He estado usando un unsigned char para almacenar banderas de máscara de bits, pero se me ocurre que alcanzaré el límite bajo ya que un carácter es solo un byte, por lo tanto, 8 bits, por lo tanto, ¿solo 8 opciones en mi máscara?

enum options{
 k1=1<<0,
 k2=1<<1,
  .... through to k8
 }

 unsigned char myOption=k2;

¿Simplemente necesito hacer myOption an int o algún otro tipo, por ejemplo, si deseo que almacene más de 8 opciones posibles (y combinaciones de opciones, por supuesto, por lo tanto, ¿por qué estoy usando la máscara de bits en primer lugar)? ¿Cuál es el mejor tipo?

preguntado el 15 de mayo de 13 a las 04:05

Guárdelo en un int y tendrá opciones de 32 bits. Haciendo esto ahora en una aplicación antigua. Usar int sin firmar. -

CHAR_BIT bits, en realidad. sizeof(Type) * CHAR_BIT le dirá cuántos tiene para cualquier tipo. -

uint16_t, uint32_t, etc,. debería ser suficiente. -

En el lugar donde alguien dijo Using int is asking for trouble, también sugirió usar unsigned int - entonces su pregunta ya está respondida allí. -

"¿Cuál es el mejor tipo?" - options myOption = k2;... O_o -

2 Respuestas

Si necesita un número desconocido de 'bits', puede usar algo como el std::vector<bool> clase, ver aquí:

http://www.cplusplus.com/reference/vector/vector-bool/

Esta es una especialización de la clase de vector que puede empaquetar los valores booleanos usando bits, por lo que es más eficiente en espacio que una matriz de bools (si necesita esa eficiencia adicional depende de usted).

Por supuesto, no sé cuál es su aplicación, hay muchas razones válidas para usar campos de bits. Sin embargo, si simplemente está almacenando un montón de valores verdaderos y falsos, algo como una matriz de bools o este vector de bools podría sea ​​más fácil de mantener (aunque tiene desventajas, por supuesto, no puede probar para ver si, digamos, 3 bits están configurados en una sola operación como puede hacerlo con enmascaramiento y campos de bits, por lo que es específico de la aplicación).

vector<bool> Aunque es algo controvertido, creo. Ver: http://howardhinnant.github.io/onvectorbool.html

Respondido el 10 de enero de 15 a las 21:01

... y si necesita un número fijo de bits y quiere asegurarse de no quedarse sin espacio, puede usar std::bitset<N>. - templatetypedef

Gracias por el comentario, no estaba al tanto de esto. Wayne Uroda

@templatetypedef y Wayne, como señalé en mi pregunta, estoy configurando combinaciones de opciones, de las cuales un poco de máscara está madura. Un vector de bools no lo haría tan fácil. Lo hace bitset apoyar operaciones similares a & y | ? - johnbakers

@Fellowshee: ¡Sí! Como se puede ver en este sitio (es.cppreference.com/w/cpp/utility/bitset), todos los operadores bit a bit están sobrecargados en bitset. También puede usar corchetes para seleccionar bits individuales por índice. Es súper útil para cosas como esta. - templatetypedef

En un vector de bools puedes configurar combinaciones de opciones, solo tienes que configurarlas una a la vez... Como dije, es específico de la aplicación. No estoy 100% seguro de lo que está haciendo, así que lo siento si mi sugerencia no se ajusta a su caso de uso :) - Wayne Uroda

#include <stdint.h>

Esto define tipos con tamaños fijos que no son específicos del compilador.

int16_t = 16 bits

uint16_t = 16 bits sin firmar

int32_t = 32 bits

Si necesita más de 64 banderas, debe considerar el ::std::vector<> como sugirió Wayne Uroda.

contestado el 15 de mayo de 13 a las 05:05

o más probablemente std::bitset - johnbakers

#0x499602D2 cstdint no fue tan ampliamente compatible la última vez que lo verifiqué. - arrendajo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.