C быстрое вычисление затем нескольких из 4?

Что быстрый путь состоит в том, чтобы окружить неподписанное int к нескольким из 4?

Несколько из 4 имеют два младших значащих бита 0, правильно? Таким образом, я мог кашировать их и затем сделать оператор переключения, добавив или 1,2 или 3 к данному uint.

Это не очень изящное решение..

Существует также арифметическая сводка новостей:

 myint == 0 ? 0 : ((myint+3)/4)*4

Вероятно, существует лучший путь включая некоторые битовые операции?

21
задан Jason 14 March 2017 в 17:00
поделиться

6 ответов

(myint + 3) & ~0x03

Добавление 3 означает, что следующий кратный из 4 становится предыдущим кратным из 4, что создается модульной операцией, выполняемой маскировкой, так как делитель имеет силу 2.

.
42
ответ дан 29 November 2019 в 06:36
поделиться

Если под "следующим кратным числом 4" вы подразумеваете наименьшее кратное число 4, которое больше вашего беззнакового значения int myint, то это сработает:

(myint | 0x03) + 1;
4
ответ дан 29 November 2019 в 06:36
поделиться

(myint + 4) & 0xFFFC

.
1
ответ дан 29 November 2019 в 06:36
поделиться

Если Вы хотите, чтобы следующий кратный 4 был строго больше myint, то это решение сработает (как и предыдущие сообщения):

(myint + 4) & ~3u

Если Вы хотите округлить до ближайшего кратного 4 (оставив myint без изменений, если будет кратным 4), то это должно сработать:

(0 == myint & 0x3) ? myint : ((myint + 4) & ~3u);
0
ответ дан 29 November 2019 в 06:36
поделиться

Я предполагаю, что вы пытаетесь добиться выравнивания входного числа, т.е. если исходное число уже кратно 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;

, хотя меня не удивило бы, если бы современные компиляторы могли определить последнее самостоятельно.

15
ответ дан 29 November 2019 в 06:36
поделиться

myint = (myint + 4) & 0xffffffc

Предполагается, что "следующее кратное 4 ", что вы всегда движетесь вверх; т.е. 5 -> 8 и 4 -> 8.

-1
ответ дан 29 November 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: