Здесь много ответов, но я добавлю свой подход, так как я нашел этот пост, работая над той же проблемой.
Начиная с того, что мы знаем здесь, это числа от 0 до 16.
Number encoded in bits minimum number of bits to encode
0 000000 1
1 000001 1
2 000010 2
3 000011 2
4 000100 3
5 000101 3
6 000110 3
7 000111 3
8 001000 4
9 001001 4
10 001010 4
11 001011 4
12 001100 4
13 001101 4
14 001110 4
15 001111 4
16 010000 5
глядя на разрывы, он показывает эту таблицу
number <= number of bits
1 0
3 2
7 3
15 4
Итак, как теперь вычислить шаблон?
Помните, что логарифмическая база 2 (n) = логарифмическая база 10 (n) / логарифмическая база 10 (2)
number logb10 (n) logb2 (n) ceil[logb2(n)]
1 0 0 0 (special case)
3 0.477 1.58 2
7 0.845 2.807 3
8 0.903 3 3 (special case)
15 1.176 3.91 4
16 1.204 4 4 (special case)
31 1.491 4.95 5
63 1.799 5.98 6
Теперь желаемый результат соответствует первой таблице. Обратите внимание, что некоторые значения также являются особыми случаями. 0 и любое число, которое является степенью 2. Эти значения не меняются, когда вы применяете потолок, поэтому вы знаете, что вам нужно добавить 1, чтобы получить минимальную длину битового поля.
Чтобы учесть особые случаи, добавьте единицу к входным данным. Результирующий код, реализованный в python:
from math import log
from math import ceil
def min_num_bits_to_encode_number(a_number):
a_number=a_number+1 # adjust by 1 for special cases
# log of zero is undefined
if 0==a_number:
return 0
num_bits = int(ceil(log(a_number,2))) # logbase2 is available
return (num_bits)
person
netskink
schedule
24.05.2017