Как я уже упоминал ранее, я прохожу через K & R, и в целом все в порядке с этим. Тем не менее, в главе 2, раздел о побитовых операторах (раздел 2.9), у меня возникли проблемы с пониманием того, как работает один из методов образца, и в результате у меня возникают проблемы с связанными упражнениями.
(Это не обман моего предыдущего вопроса о смещении бит, кстати, это новое и улучшенное!)
Итак, здесь предоставлен метод:
unsigned int getbits(unsigned int x, int p, int n) {
return (x >> (p + 1 - n)) & ~(~0 << n);
}
Идея состоит в том, что при заданном числе x она вернет n бит, начиная с позиции p, считая справа (самый дальний правый бит - позиция 0). Учитывая следующий метод main():
int main(void) {
int x = 0xF994, p = 4, n = 3;
int z = getbits(x, p, n);
printf("getbits(%u (%x), %d, %d) = %u (%X)\n", x, x, p, n, z, z);
return 0;
}
Вывод:
getbits (63892 (f994), 4, 3) = 5 (5)
Я получаю части этого, но у меня возникают проблемы с "большой картиной", в основном из-за бит (не предназначенного для каламбура), который я не понимаю.
(Заметьте, что я не ищу помощь в связанных упражнениях - думаю, если бы я "получил" это, я смог бы получить их.)
В части, с которой у меня возникают проблемы, есть часть дополнения: ~(~0 << n)
. Я думаю, что получаю первую часть, имея дело с x; это эта часть (а затем и маска), с которой я борюсь - и как все это объединяется, чтобы фактически извлечь эти биты. (Который я проверил, что он делает, как с кодом, так и с проверкой моих результатов с помощью calc.exe - слава богу, он имеет двоичный вид!)
Любая помощь?