Pergunta

Eu uso um byte para armazenar alguns bandeira como 10101010and eu gostaria de saber como verificar se um pouco específica está em 1 ou 0.

Foi útil?

Solução

Aqui está uma função que pode ser usado para testar qualquer bit desejado:

bool is_bit_set(unsigned value, unsigned bitindex)
{
    return (value & (1 << bitindex)) != 0;
}

Um pouco de explicação:

O operador de deslocamento esquerdo (<<) é usado para criar uma máscara de bits. (1 << 0) será igual a 00000001, (1 << 1) irá ser igual a 00000010, (1 << 3) irá ser igual a 00001000, etc. Assim, uma mudança de 0 testes o bit mais à direita. Uma mudança de 31 seria o bit mais à esquerda de um valor de 32 bits.

O bit a bit E operador (&) dá um resultado onde todos os bits que são 1 em ambos os lados são set. Exemplos: 1111 & 0001 = 0001; 1111 & 0010 == 0010; 0000 & 0001 = 0000. Assim, a expressão (valor & (1 << bitindex)) irá retornar a máscara de bits se o bit associado é de 1 em valor, ou retornará 0 se o bit associado é 0.

Finalmente, nós apenas verificar se o resultado for diferente de zero. (Isso realmente pode ser deixado de fora, mas eu gostaria de torná-lo explícito.)

Outras dicas

Como uma extensão da resposta @Daoks

Ao fazer pouco de manipulação de que realmente ajuda a ter um conhecimento muito sólido de operadores bit a bit .

Além disso, o bit a bit operador "E" em C é &, então o que você está querendo fazer é:

unsigned char a = 0xAA; // 10101010 in hex
unsigned char b = (1 << bitpos); //Where bitpos is the position you want to check

if(a & b) {
    //bit set
}

else {
    //not set
}

Acima eu usei o bit a bit "E" (e em C) para verificar se um pouco particular foi definido ou não. Eu também usei duas maneiras diferentes de formular números binários. Eu recomendo que você confira o link Wikipedia acima.

Você pode usar um operador AND. Exemplo, você tem: 10101010 e quiser verificar o terceiro bit você pode fazer:. (10101010 E 00100000) e se você conseguir 00100000 você sabe que você tem a bandeira na terceira posição de 1

Se você estiver usando C ++ e a biblioteca padrão é permitido, eu sugiro armazenar suas bandeiras em um bitset:

#include <bitset>
//...
std::bitset<8> flags(someVariable);

como então você pode verificar e definir bandeiras usando o] operador de indexação [.

A resposta de Kristopher Johnson é muito bom se você gosta de trabalhar com campos individuais como este. Eu prefiro para tornar o código mais fácil de ler usando campos de bits em C.

Por exemplo:

struct fieldsample
{
  unsigned short field1 : 1;
  unsigned short field2 : 1;
  unsigned short field3 : 1;
  unsigned short field4 : 1;
}

Aqui você tem uma estrutura simples, com quatro campos, cada um pouco de tamanho. Em seguida, você pode escrever seu código usando o acesso estrutura simples.

void codesample()
{
  //Declare the struct on the stack.
  fieldsample fields;
  //Initialize values.
  fields.f1 = 1;
  fields.f2 = 0;
  fields.f3 = 0;
  fields.f4 = 1;
  ...
  //Check the value of a field.
  if(fields.f1 == 1) {}
  ...
}

Você obtém o mesmo pequena vantagem de tamanho, além de código legível porque você pode dar aos seus campos de nomes significativos dentro da estrutura.

Ninguém do estado errada até agora, mas para dar um método para verificar um pouco arbitrária:

int checkBit( byte in, int bit )
{
  return in & ( 1 << bit );
}

Se a função retorna diferente de zero, o bit é definido.

byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set

int isThirdBitSet(byte in) {
 return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise
}

você pode fazer como Daok diz e você fazer um bit a bit OR ao resultante da operação anterior e. Neste caso, você terá um resultado final de 1 ou 0.

Tradicionalmente, para verificar se o menor bit é definido, este será algo parecido com:

int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
    doSomething();

Use um bit a bit (! Não lógico) e comparar o valor contra uma máscara de bits.

if (var & 0x08) {
  /* the fourth bit is set */
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top