fk0, легенда (01.03.2019 13:19, просмотров: 175) ответил fk0 на Про индусов ты таки прав. Для начала, на кой хер там плавучка? Некоторые вон, посмотри, и без таблиц обходятся. Там ж синус не рандомно в алгоритме нужен, а в какой-то последовательности, прошу меня поправить, я уж не помню. И в принципе когда
Это пиздец, таблицы можно делать хотя бы на пол-пи, а не два пи и миррорить. Кода больше? Зато промахов кеша в таблицах неебического размера меньше. Про что я выше писал, не осилил, но смотри таблицу разбили на 1/2n и она стала маленькой (по ссылке). Гигантская таблица для бит-реверса тоже, насколько она нужна?
Классика жанра, здесь 100500 раз приводили:
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return ((x >> 16) | (x << 16));
Повторюсь, табличные алгоритмы были хорошо на 8-битниках, а на современных процах могут выйти боком, пока он там строчку памяти читает кучу арифметических команд посчитать можно.
Для 8-битного реверса (который может служить базой для любой разрядности, благо байты переставить
уже не тяжело) есть экзотические варианты:
// при наличии 32-битного умножителя
x = ((x * 0x0802LU & 0x22110LU) | (x * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
// при наличии 64-битого умножителя
x = (x * 0x0202020202ULL & 0x010884422010ULL) % 1023;
Если умножитель однотактный, то чего на спичках экономить.
[ZX]