В главе 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 - слава Богу, у него есть двоичное представление!)
Любая помощь?