В зависимости от того, как ваше оборудование и, возможно, как ваш интерпретатор работает с целыми числами, вы можете сделать это:
Предполагая, что беззнаковое целое число равно 16 битам (чтобы мои маски были короткими):
r = r & 0000000011111111;
Если бы int был 32-битным, вам понадобилось бы еще 16 нулей в начале битовой маски.
После этого побитового AND максимальное значение r может быть равно 255. В зависимости от аппаратного обеспечения,беззнаковое целое может сделать что-то странное, если значение меньше нуля.Я считаю, что этот случай уже обрабатывается битовой маской (по крайней мере, на оборудовании, которое я использовал).Если нет, вы можете сначала сделать r = min(r, 0);
.