2012-06-26 4 views
0

Что делает эта функция, поскольку я не мог понять ее цели.Что делает эта странная функция?

int f(int n, int l, int r) 
{ 
return (n << l) >> r; 
} 
+0

Подсказка: используйте неподписанные типы (или результат будет расширен с расширением) – wildplasser

+0

Аргумент n должен определенно иметь неподписанный тип, чтобы сделать код более надежным. Левый сдвиг знаковой величины может переполнять целочисленный диапазон со знаком, оставляя результат неопределенным для стандартной семантики C/C++. Аналогично, правый сдвиг отрицательной величины дает неопределенный результат. – njuffa

ответ

4

Это сдвигает NL битов влево, то г биты вправо

Это эффективно умножает на 2^л, а затем делит на 2^г

Или иначе говоря, это будет ноль из младших разрядов (lr).

+0

Я знал первые два из них, но не третий комментарий. Я пробовал код, но не был точно уверен в цели функции. Спасибо – Sreeni

0

@ 8butwide избили меня, но this link также может быть полезен.

1

Я всегда подхожу к ним, выполняя эксперимент с меньшими числами и мышлением в двоичном формате. Например. давайте сделаем их unsigned Сначала 8-битные значения. Пусть n будет 0xFF (255), l be 3, r be 2.

Итак, это 2 шага (ча-ча). Первый шаг мы сдвинем влево l бит.

1111 1111b << 3 == 1111 1000b == 0xF8 == 248 

Затем мы перемещаем результат сразу r биты:

1111 1000b >> 2 == 0011 1110b == 0x3E == 62 

Теперь, как отметил @wildplasser, ваши ценности подписываются, поэтому вместо перехода в 0, вы будете по знаку. Итак, предположим, что 8-битные подписали значений. Пусть n будет 0xFF снова, (-1) в десятичном формате.

Левая смена остается неизменной, но когда вы сдвигаете правую сторону, бит знака будет расширен.

1111 1111b << 3 == 1111 1000b == 0xF8 == -8 
1111 1000b >> 2 == 1111 1110b == 0xFE == -2 

Так что я не уверен, что намерение функции есть, но, по крайней мере, я понимаю, что он делает. Если это какая-то стандартная идиома для чего-то, я не знаю, что это такое.

+0

Я думал о том же, что функция была использована для выполнения какой-то стандартной идиомы. Спасибо за ваши комментарии. – Sreeni

Смежные вопросы