Theory
Нет синтаксиса C для доступа или установки n-го бита встроенного типа данных (например, 'char'). Однако вы можете получить доступ к битам с помощью логической операции И и установить биты с помощью логической операции ИЛИ.
В качестве примера, скажем, что у вас есть переменная, которая содержит 1101, и вы хотите проверить 2-й бит слева. Просто выполните логическое И с 0100:
1101
0100
---- AND
0100
Если результат не равен нулю, значит, 2-й бит должен быть установлен; в противном случае это не было установлено.
Если вы хотите установить третий бит слева, выполните логическое ИЛИ с 0010:
1101
0010
---- OR
1111
Вы можете использовать операторы C && (для AND) и || (для ИЛИ) для выполнения этих задач. Вам нужно будет самостоятельно создать шаблоны доступа к битам (0100 и 0010 в приведенных выше примерах). Хитрость заключается в том, чтобы помнить, что младший значащий бит (LSB) имеет значение 1 с, следующий младший бит - 2 с, затем 4 с и т. Д. Таким образом, схема доступа к битам для n-го LSB (начиная с 0) представляет собой просто значение 2 ^ п. Самый простой способ вычислить это в C - сдвинуть двоичное значение 0001 (в этом четырехбитном примере) влево на требуемое количество мест. Так как это значение всегда равно 1 в беззнаковых целочисленных величинах, это просто «1 << n» </p>
Пример
unsigned char myVal = 0x65; /* in hex; this is 01100101 in binary. */
/* Q: is the 3-rd least significant bit set (again, the LSB is the 0th bit)? */
unsigned char pattern = 1;
pattern <<= 3; /* Shift pattern left by three places.*/
if(myVal && (char)(1<<3)) {printf("Yes!\n");} /* Perform the test. */
/* Set the most significant bit. */
myVal |= (char)(1<<7);
Этот пример не был проверен, но должен служить иллюстрацией общей идеи.