Эффективное (побитовое) деление на 24 - PullRequest
2 голосов
/ 07 декабря 2011

Кодирование для встроенной платформы без целочисленного делителя (или множителя), есть ли быстрый способ выполнить деление на 24?

Умножить на 24 - это просто

int a;
int b = (a << 4) + (a << 3); // a*16 + a*8

Но разделение? Это действительно простой делитель с двумя битами?

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Если вам не нужно, чтобы результат был точным, то вы можете подумать об умножении на 1/24:

uint16_t a = ...;

uint32_t b = (uint32_t)a * (65536L / 24);

uint16_t c = b / 65536;

Конечно, если ваша платформа не имеет аппаратного множителя, вам нужно оптимизировать это умножение. Как выясняется, (65536/24) примерно равно 2730, что составляет 101010101010 в двоичном виде. Так что умножение может быть достигнуто с 3 сменами и добавляет.

1 голос
/ 07 декабря 2011

Ну, во-первых, вы можете использовать тот факт, что 24=8*3, так что вы можете разделить на 8, используя сдвиг еще раз: a / 8 == a >> 3.После этого вы должны разделить результат на 3.Дискуссию о том, как сделать это эффективно, можно найти здесь .Конечно, если вы кодируете на c (или на любом другом языке более высокого уровня), возможно, стоит сначала просто взглянуть на выход компилятора, возможно, у компилятора уже есть некоторые приемы для этого.

...