Я предполагаю, что вы пытаетесь достичь выравнивания входного числа, то есть, если исходное число уже кратно 4, его не нужно менять. Однако это не ясно из вашего вопроса. Может быть, вы хотите следующий кратный, даже если исходный номер уже кратен? Пожалуйста, уточните.
Чтобы выровнять произвольное неотрицательное число i
по произвольной границе n
, вам просто нужно сделать
i = i / n * n;
Но это выровняет его к отрицательной бесконечности. Чтобы выровнять его по положительной бесконечности, добавьте n - 1
перед выполнением выравнивания
i = (i + n - 1) / n * n;
Это уже достаточно для всех целей и задач. В вашем случае это будет
i = (i + 3) / 4 * 4;
Однако, если вы предпочитаете выжимать из этого несколько тактовых частот процессора, вы можете использовать тот факт, что i / 4 * 4
можно заменить на немного-тиддлинг i & ~0x3
, что даст вам
i = (i + 3) & ~0x3;
хотя меня не удивило бы, если бы современные компиляторы могли выяснить последнее самостоятельно.