variavel = 1 << 33;torna-se inpertinente as coisas começam a ficar sérias. Em prol disso fiz algumas funções que sanam essa necessidade (não que o bitset não o faça) de trabalhar com mais de 32 bits (agora o flag é infinito filhote).
Segue as funções
void set_flag(char *flags, int flag) { flags[ (int)((float)(flag +1) / 8.0) ] |= (1 << (flag % 8)); } void remove_flag(char *flags, int flag) { flags[ (int)((float)(flag +1) / 8.0) ] ^= (1 << (flag % 8)); } bool has_flag(char *flags, int flag) { return (int)flags[ (int)((float)(flag +1) / 8.0) ] & (1 << (flag % 8)); }
set_flag seta bit 1, remove_flag seta bit 0 e has_flag verifica se o bit é 1. O indice usado é 0. A função não verifica estouro de memória, portando cuidado!
Exemplo
char flags[1] = {0}; // 1 byte = 8 bits set_flag((char*)flags, 1); // liga o segundo bit set_flag((char*)flags, 2); // liga o terceiro bit printf("%d\n", has_flag(flags, 0) ) printf("%d\n", has_flag(flags, 1) )
Nenhum comentário:
Postar um comentário