AestheteAnimus писал(а): ↑06.10.2008 02:17
достаточно глянуть листинги, чтобы увидеть, что версия с массивом быстрее. Ну лично мне такой подход не нравится, поэтому и предлагаю вариант с бинарным поиском.
А чем именно не нравится?
Но код
Код: Выделить всё
ssize_t bit_index(uint8_t x)
{
if (x == 0) return -1;
int n = 0;
if (x > 0xF) {n += 4; x >>= 4; }
if (x > 0x3) {n += 2; x >>= 2; }
if (x > 0x1) {n += 1;}
return n;
}
действительно красивый.
Правда, у меня сначала возник вопрос: почему при первом сравнении
а не
(учитывая что начальное значение равно нулю)
Но потом, посмотрев листинг ассемблера, увидел, что он сделал именно
Grom писал(а): ↑02.10.2008 18:33
Прошу прощения, но в постановке задачи явно было сказано:
Получаю байт с единицей в одном бите.
Совершенно верно. И если в байте
всегда будет только
одна единица, то достаточно будет массива размером 128:
Код: Выделить всё
static char tb[128] = { 7,6,0,5,0,0,0,4,[15]=3,[31]=2,[63]=1};
...
nb = tb[b-1];
Но такая программа не может считаться надёжной, т.к. не известен результат в случае, если число единиц в байте не будет равно 1. А это принципе возможно.