Допустим, есть число 102. Как узнать, на сколько его нужно увеличить, чтоб оно стало кратным 16?
Ответ
Для конкретного случая кратности числу 16 можно использовать битовую арифметику для взятия модуля:
int p = 102;
int needAdd = -p & 0xf;
В общем случае вам нужен остаток (в Эйлеровском смысле, положительный). К сожалению, оператор % в языке C# не очень хорош для отрицательных значений аргумента, поэтому нам придётся написать свой:
public static int Modulo(int p, int q)
{
q = Math.Abs(q);
var result = p % q;
if (result < 0)
result += q;
return result;
}
Имея правильный остаток, задача тривиальна:
int p = 102;
int q = 16;
int needAdd = Modulo(-p, q);
Код не зависит от знаков чисел p, q (только бы q не было нулём).
Для пуристов: (needAdd + p) ≡ (−p + p) ≡ 0 (mod q), а по построению, needAdd ∈ [0, q).
Комментариев нет:
Отправить комментарий