O mapa de bits não se aplica a esse caso. O mapa de bits é útil para representar vários flags. Vamos supor que para cada pedido, a pessoa pudesse:
- Embalar para presente
- Usar caixa reciclada;
- Solicitar entrega noturna;
- Solicitar entrega apenas nos finais de semana.
Note que o usuário pode escolher entre qualquer combinação desses itens.
Você poderia representar isso por 4 booleans. Entretanto, cada boolean ocupa um byte inteiro, pois esta é a menor unidade possível para o computador. Uma forma extremamente compacta seria agrupar esses 4 booleans num único byte, através de um mapa de bits.
Como cada campo binário tem 8 bits, definiremos então que o primeiro bit (da esquerda para direita) representa o item 1 daquela lista, o segundo bit o item 2, e assim por diante.
Então, um valor como 1010, representaria que nosso usuário não quer embalar nada para presente, quer usar caixa reciclada, solicita entrega noturna e não faz questão que entrega chegue nos finais de semana.
Vamos representar cada bit desses separadamente:
0001 - É o primeiro bit, o valor dessa constante é 1;
0010 - É o segundo bit, o valor dessa constante é 2;
0100 - É o segundo bit, o valor dessa constante é 4;
1000 - É o segundo bit, o valor dessa constante é 8;
Definimos isso na programação assim:
private static final int EMBALAR_PRESENTE = 1;
private static final int CAIXA_RECICLADA = 2;
private static final int ENTREGA_NOTURNA = 4;
private static final int ENTREGA_FINAIS_SEMANA = 8;
Com esses valores é bem fácil montar um byte com combinações de valores. Basta associarmos valores com o operador OU bitwise:
int opcoes = EMBALAR_PRESENTE | ENTREGA_FINAIS_SEMANA; //Resulta no valor 1001
Também é fácil testar se nosso usuário definiu ou não alguma dessas opções. Para isso, basta usar o operador E bitwise, e verificar se o resultado é igual ao valor que estivermos testando:
if (opcoes & ENTREGA_FINAIS_SEMANA == ENTREGA_FINAIS_SEMANA)
agendarParaSabado();
Você pode até mesmo testar conjuntos de opções de uma só vez. O teste fica assim:
int entregaEspecial = ENTREGA_NOTURNA | ENTREGA_FINAIS_SEMANA;
if (opcoes & entregaEspecial == entregaEspecial) {
fazerEntregaEspecial();
}
Há pouco ganho de processamento e, a menos que você tenha centenas de milhares de objetos (ou muito pouca memória), há pouco ganho de memória também. Essa opção é interessante para protocolos de rede ou sinalização de hardware, mas pouco interessante para qualquer sistema comercial normal hoje em dia.