Что делает эта функция, поскольку я не мог понять ее цели.Что делает эта странная функция?
int f(int n, int l, int r)
{
return (n << l) >> r;
}
Что делает эта функция, поскольку я не мог понять ее цели.Что делает эта странная функция?
int f(int n, int l, int r)
{
return (n << l) >> r;
}
Это сдвигает NL битов влево, то г биты вправо
Это эффективно умножает на 2^л, а затем делит на 2^г
Или иначе говоря, это будет ноль из младших разрядов (lr).
Я знал первые два из них, но не третий комментарий. Я пробовал код, но не был точно уверен в цели функции. Спасибо – Sreeni
@ 8butwide избили меня, но this link также может быть полезен.
Я всегда подхожу к ним, выполняя эксперимент с меньшими числами и мышлением в двоичном формате. Например. давайте сделаем их 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
Так что я не уверен, что намерение функции есть, но, по крайней мере, я понимаю, что он делает. Если это какая-то стандартная идиома для чего-то, я не знаю, что это такое.
Я думал о том же, что функция была использована для выполнения какой-то стандартной идиомы. Спасибо за ваши комментарии. – Sreeni
Подсказка: используйте неподписанные типы (или результат будет расширен с расширением) – wildplasser
Аргумент n должен определенно иметь неподписанный тип, чтобы сделать код более надежным. Левый сдвиг знаковой величины может переполнять целочисленный диапазон со знаком, оставляя результат неопределенным для стандартной семантики C/C++. Аналогично, правый сдвиг отрицательной величины дает неопределенный результат. – njuffa