Что быстрый путь состоит в том, чтобы окружить неподписанное int
к нескольким из 4
?
Несколько из 4 имеют два младших значащих бита 0, правильно? Таким образом, я мог кашировать их и затем сделать оператор переключения, добавив или 1,2 или 3 к данному uint
.
Это не очень изящное решение..
Существует также арифметическая сводка новостей:
myint == 0 ? 0 : ((myint+3)/4)*4
Вероятно, существует лучший путь включая некоторые битовые операции?
(myint + 3) & ~0x03
Добавление 3 означает, что следующий кратный из 4 становится предыдущим кратным из 4, что создается модульной операцией, выполняемой маскировкой, так как делитель имеет силу 2.
.Если под "следующим кратным числом 4" вы подразумеваете наименьшее кратное число 4, которое больше вашего беззнакового значения int myint, то это сработает:
(myint | 0x03) + 1;
Если Вы хотите, чтобы следующий кратный 4 был строго больше myint
, то это решение сработает (как и предыдущие сообщения):
(myint + 4) & ~3u
Если Вы хотите округлить до ближайшего кратного 4 (оставив myint
без изменений, если будет кратным 4), то это должно сработать:
(0 == myint & 0x3) ? myint : ((myint + 4) & ~3u);
Я предполагаю, что вы пытаетесь добиться выравнивания входного числа, т.е. если исходное число уже кратно 4, то его не нужно менять. Однако это не ясно из вашего вопроса. Может быть, вам нужно следующее кратное число, даже если исходное число уже кратное? Просьба уточнить.
Чтобы выровнять произвольное неотрицательное число i
на произвольной границе n
, вам просто нужно сделать
i = i / n * n;
Но это выровняет его в сторону отрицательной бесконечности. Чтобы выровнять его по положительной бесконечности, добавьте n - 1
перед выполнением выравнивания
i = (i + n - 1) / n * n;
. Этого уже достаточно для всех намерений и целей. В вашем случае это будет
i = (i + 3) / 4 * 4;
. Однако, если вы предпочитаете выжать из этого несколько тактов ЦП, вы можете использовать тот факт, что i / 4 * 4
можно заменить на бит -twiddling i & ~ 0x3
, что дает вам
i = (i + 3) & ~0x3;
, хотя меня не удивило бы, если бы современные компиляторы могли определить последнее самостоятельно.
myint = (myint + 4) & 0xffffffc
Предполагается, что "следующее кратное 4 ", что вы всегда движетесь вверх; т.е. 5 -> 8 и 4 -> 8.