Получает pos
-й бит (старший значащий бит = 0-й) из 8-битного массива символов bits
.
Обычно unsigned char
имеет длину 8 бит. Следовательно,
bits[(int)(pos / 8)]
сначала извлечет октет, в котором находится нужный бит. (pos
= 8 & times; pos/8
+ pos%8
)
Затем мы получаем фактический бит из октета:
10111010
# 01234567
Чтобы извлечь немного, мы выполняем &
с «маской». Операция &
выполняется по битам, которая возвращает 1, если 1 присутствует в одном и том же бите в обоих операндах, в противном случае - 0, например,
10111010
& 11010001
= 10010000
Поэтому, чтобы извлечь 0-й бит, мы &
с 10000000 = 0x80, а с 1-м битом мы &
с 01000000 = 0x40 и т. Д. Цикл должен получить правильную маску.
Но &
дает только 0x80, 0x40 и т. Д. Или 0, вместо 1 или 0. Окончательное условное
(mask & bits[...]) == mask) ? 1 : 0
выполняет задание по преобразованию ненулевой маски в 1 и от 0 до 0.
Кстати, обычно мы используем оператор сдвига битов >>
или <<
для вычисления маски. Это более эффективно и понятно для тех, кто знает битовые операции.
int bit_get(const uint8_t* bits, int pos) {
uint8_t mask = 1 << (7 - pos % 8);
return (bits[pos/8] & mask) ? 1 : 0;
}