2014-11-24 2 views
1

Я хочу округлить целое число, i, вплоть до ближайшего кратного 4.Стандартный способ обогнуть целое вплоть до ближайшего кратного 4

Например:

0 -> 0 
1 -> 0 
2 -> 0 
3 -> 0 
4 -> 4 
5 -> 4 
6 -> 4 
7 -> 4 
8 -> 8 
9 -> 8 

Очевидным образом для меня чтобы сделать это было бы:

i = (i/4) * 4; 

Но я подвергся критике за использование этого, потому что, мол, неясно, и выглядит как ошибка.

Я знаю очевидной альтернативы, побитовое смещение:

i = (i >> 2) << 2; 

Но потом я понял, что есть другой подход полностью:

(i | 3) - 3 

Пример программы:

#include <stdio.h> 

int main(void) { 
    int i; 
    for(i = 0; i < 4*4; i++) { 
     printf("%d %d %d %d\n", i, (i/4) * 4, (i >> 2) << 2, (i | 3) - 3); 
    } 
    return 0; 
} 

Я хочу знать стандартный способ сделать это, и если современный компилятор с наивысшим opti misation будет достаточно интеллектуальным, чтобы преобразовать мой код в самый быстрый метод.

+7

Самый быстрый - 'i & ~ 3'. –

+0

@ LeeDanielCrocker Я собирался предположить, что, но педантично, я думаю, что это может быть IB. Тем не менее, это, вероятно, будет работать нормально во всех нормальных условиях. – Mysticial

+2

Что должно «-1» округлить до? 0? или -4? – Mysticial

ответ

2

создать функцию Thats именованные таким образом, чтобы было ясно, что он должен делать и использовать эту функцию:

static inline int roundToMultipleOf4(int v){ 
    return (v/4)*4; 
} 

Так при использовании функции ясно, что код должен делать, а затем ищет при определении функции становится также понятным, почему за делением прямо следует умножение.

+0

Но это все еще не является оправданием для использования разделения вообще. –

+0

Его не обвиняли в использовании подразделения. но для написания нечеткого кода. Кроме того, компилятор оптимизирует разделение и использует сдвиги или даже некоторые манипуляции с битами –

+0

Неясно? Не для чего нужны комментарии? –

3

Это вопрос мнения. Мое мнение таково:

i = (i/4) * 4; 

- лучший способ. Это просто, и это, очевидно, дает правильный ответ. Любой другой код, который вы пишете, кто-то его читает, должен будет остановиться и подумать о том, что он делает, и может ли он иметь какие-либо угловые случаи, которые не работают.

Один вопрос, который может возникнуть, - это что делать, если i отрицательный. C использует «усечение к нулю», поэтому, если i отрицательно, это выражение дает отрицательный результат на abs(i).

Эквивалентный способ:

который также является простым и понятным.

Смежные вопросы