Страницы

Поиск по вопросам

среда, 12 февраля 2020 г.

Деление заменить смещением(сдвигом)

#математика #деление


int b=(a<<6)+(a<<5)+(a<<2);//умножить на 100
int c=(a<<10)-((a<<4)+(a<<3));//умножить на 1000
int d=(a<<3)+(a<<1);//умножить на 10


Подскажете как поделить на 10,100,1000 любого числа 'a' со смещением(сдвигом)? Целочисленный
int (остаток от деления не важен).
    


Ответы

Ответ 1



Запросто :) 0.110 = 0.00011001100110012. То есть деление на 10 — это 1 / 16 + 1 / 32 + 1 / 256 + 1 / 512 + ... Дальше пояснять? :) А если серьезно - возьмите книгу Уоррена «Алгоритмические трюки для программистов», там есть глава 10, «Целое деление на константы». Там много стоящего. То же деление на 10: unsigned divu10(unsigned n) { unsigned q, r; q = (n >> 1) + (n >> 2); q = q + (q >> 4); q = q + (q >> 8); q = q + (q >> 16); q = q >> 3; r = n - q * 10; return q + ((r + 6) >> 4); // return q + (r > 9); }

Комментариев нет:

Отправить комментарий