Подтвердить что ты не робот

Как проверить мой байтовый флаг?

Я использую байт для хранения некоторого флага типа 10101010, и я хотел бы знать, как проверить, что конкретный бит находится в 1 или 0.

4b9b3361

Ответ 1

Здесь функция, которая может быть использована для проверки любого желаемого бита:

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

Немного объяснения:

Оператор сдвига влево (< <) используется для создания битовой маски. (1 < 0) будет равна 00000001, (1 < 1) будет равна 00000010, (1 < 3) будет равна 00001000 и т.д. Таким образом, сдвиг 0 тестов самый правый бит. Сдвиг 31 будет самым левым битом 32-битного значения.

Побитовый и оператор (&) дает результат, в котором установлены все биты, равные 1 с обеих сторон. Примеры: 1111 и 0001 = 0001; 1111 и 0010 == 0010; 0000 и 0001 = 0000. Таким образом, выражение (значение и (1 < битиндекс)) возвращает битмаску, если соответствующий бит равен 1, или будет возвращать 0, если соответствующий бит равен 0.

Наконец, мы просто проверяем, отличен ли результат от нуля. (Это действительно может быть опущено, но мне нравится делать его явным.)

Ответ 2

Как расширение ответа @Daoks

При выполнении манипуляции с битами он действительно помогает получить очень четкое знание побитовых операторов.

Также побитовый оператор "AND" в C равен &, поэтому вы хотите:

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
}

Выше я использовал побитовое "AND" (& in C), чтобы проверить, был ли установлен конкретный бит или нет. Я также использовал два разных способа формулирования двоичных чисел. Я настоятельно рекомендую вам проверить ссылку Википедии выше.

Ответ 3

Вы можете использовать оператор И. Например, у вас есть: 10101010, и вы хотите проверить третий бит, который вы можете сделать: (10101010 и 00100000), и если вы получите 00100000, вы знаете, что у вас есть флаг в третьей позиции до 1.

Ответ 4

Если вы используете С++, и стандартная библиотека разрешена, я предлагаю хранить ваши флагов в битрейте:

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

так как вы можете проверять и устанавливать флаги с помощью оператора индексирования [].

Ответ 5

Ответ Кристофера Джонсона очень хорош, если вам нравится работать с отдельными полями, подобными этому. Я предпочитаю, чтобы код читался легче, используя битовые поля в C.

Например:

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

Здесь у вас есть простая структура с четырьмя полями, каждая размером 1 бит. Затем вы можете написать свой код, используя простой доступ к структуре.

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) {}
  ...
}

Вы получаете такое же небольшое преимущество, плюс читаемый код, потому что вы можете дать своим полям значимые имена внутри структуры.

Ответ 6

Пока никто не ошибался, но чтобы дать способ проверить произвольный бит:

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

Если функция возвращает ненулевое значение, бит устанавливается.

Ответ 7

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
}

Ответ 8

вы можете сделать, как говорит Даок, и вы делаете бит бит или в результате предыдущей операции И. В этом случае вы получите окончательный результат 1 или 0.

Ответ 9

Традиционно, чтобы проверить, установлен ли самый младший бит, это будет выглядеть примерно так:

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

Ответ 10

Используйте побитовое (не логическое!) и сравниваем значение с битовой маской.

if (var & 0x08) {
  /* the fourth bit is set */
}