Вот функция, которую можно использовать для проверки любого желаемого бита:
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-битного значения. </p>
Оператор побитового и (()) дает результат, в котором установлены все биты, равные 1 с обеих сторон. Примеры: 1111 и 0001 = 0001; 1111 и 0010 == 0010; 0000 & 0001 = 0000. Таким образом, выражение (значение & (1 << bitindex)) вернет битовую маску, если связанный бит равен 1 по значению, или вернет 0, если связанный бит равен 0. </p>
Наконец, мы просто проверяем, является ли результат ненулевым. (На самом деле это можно было бы опустить, но я хотел бы сделать это явным.)