@IndusDev

Битовые операции K&R?

Для иллюстрации некоторых побитовых операций рассмотрим функцию getbits(x, p, n), которая
формирует поле в n битов, вырезанных из х, начиная с позиции p, прижимая его к правому краю.
Предполагается, что 0-й бит — крайний правый бит, а n и p — осмысленные положительные числа.
Например, getbits(x, 4, 3) вернет в качестве результата 4, 3 и 2-й биты значения х, прижимая их к
правому краю. Вот эта функция:
/* getbits: получает п бит, начиная с р-й позиции */
unsigned getbits(unsigned х, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
Выражение х >> (p+1-n) сдвигает нужное нам поле к правому краю.


Фрагмент из книги K&R. Собственно, именно с битовыми операциями в этой книге у меня возникают проблемы. Видимо, здесь предполагается, что ты уже владеешь знаниями о них...
Ну, в общем, непонятно откуда взялось (p+1-n), как получить данное выражение?
+ Что значит "начиная с позиции p"? Позиция считается с правого края, считая, что крайний правый бит находится на позиции 0?
  • Вопрос задан
  • 274 просмотра
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Позиция считается слева, 31,30,...,2,1,0. Оно получилось, потому что именно на такое количество бит надо сдвинуть, чтобы прижать к правому краю.
Например, getbits(x, 4, 3) вернет в качестве результата 4, 3 и 2-й биты значения х, прижимая их к
правому краю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы