Как предполагает Weather Vane,
bin = floor( log2 ( (value + 9) / 10 ))
также:
bin = floor( log2 ( floor( (value + 9) / 10 ) ))
Целочисленное деление (i1 / i2) в C равно trunc (i1 / i2) (усечение в направленииноль), что эквивалентно floor (i1 / i2) для неотрицательных целых чисел, поэтому нет необходимости реализовывать внутренний floor.
floor (log2 (i)) может быть реализован довольно эффективно.См. принятый ответ здесь для быстрых 32-разрядных и 64-разрядных целочисленных реализаций.
Вот код (действителен, когда int является 32-разрядным). OnlineGDB
#include <stdio.h>
const unsigned int tab32[32] = {
0, 9, 1, 10, 13, 21, 2, 29,
11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7,
19, 27, 23, 6, 26, 5, 4, 31};
unsigned int log2_32(unsigned int value)
{
value |= value >> 1;
value |= value >> 2;
value |= value >> 4;
value |= value >> 8;
value |= value >> 16;
return tab32[(value * 0x07C4ACDD) >> 27];
}
int main()
{
unsigned int value = 151;
unsigned int bin = 0;
if (value > 0)
bin = log2_32( (value + 9) / 10 );
printf("value: %u, bin: %u", value, bin);
return 0;
}