Вычисление битов, необходимых для хранения десятичного числа

Это вопрос домашнего задания, с которым я застрял.

Рассмотрим целочисленное представление без знака. Сколько бит потребуется для хранения десятичного числа, содержащего:

i) 3 digits ii) 4 digits iii) 6 digits iv) n digits

Я знаю, что диапазон целого числа без знака будет от 0 до 2 ^ n, но я не понимаю, как от этого зависит количество битов, необходимых для представления числа. Пожалуйста, помогите мне.

Заранее спасибо.


person Community    schedule 22.08.2011    source источник
comment
На самом деле диапазон целого числа без знака составляет от 0 до 2^n - 1 для n бит.   -  person rghome    schedule 05.11.2018
comment
@rghome У этого свойства есть имя? Я думаю, это потрясающе.   -  person Marwan    schedule 26.10.2020
comment
@Marwan Марван Я не совсем уверен, какое свойство вы имеете в виду, но, возможно, экспоненциальный - это слово, которое вы ищете.   -  person rghome    schedule 26.10.2020
comment
Я говорю об этом, диапазон целого числа без знака составляет от 0 до 2 ^ n - 1 для n бит. Это просто совпадение, что требуемое здесь количество битов равно log_2?   -  person Marwan    schedule 26.10.2020
comment
Может быть, я сумасшедший, забудь об этом.   -  person Marwan    schedule 26.10.2020


Ответы (12)


Что ж, вам просто нужно рассчитать диапазон для каждого случая и найти наименьшую степень числа 2, которая выше этого диапазона.

Например, в i) 3 десятичных цифры -> 10 ^ 3 = 1000 возможных чисел, поэтому вам нужно найти наименьшую степень числа 2, превышающую 1000, что в данном случае равно 2 ^ 10 = 1024 (10 бит).

Редактировать: в основном вам нужно найти количество возможных чисел с количеством цифр, которые у вас есть, а затем найти, какое количество цифр (в другом основании, в этом случае основание 2, двоичное) имеет по крайней мере те же возможные числа, что и в десятичном виде.

Чтобы рассчитать количество возможностей, учитывая количество цифр: possibilities=base^ndigits

Итак, если у вас есть 3 цифры в десятичной системе счисления (основание 10), у вас есть 10^3=1000 возможности. Затем вам нужно найти количество цифр в двоичном формате (биты, основание 2), чтобы число возможностей было не менее 1000, что в данном случае равно 2^10=1024 (9 цифр недостаточно, потому что 2^9=512 меньше 1000).

Если вы обобщаете это, у вас есть: 2^nbits=possibilities <=> nbits=log2(possibilities)

Что применительно к i) дает: log2(1000)=9.97 и, поскольку количество битов должно быть целым числом, вы должны округлить его до 10.

person guardianpt    schedule 22.08.2011
comment
Итак, мне нужно 997 бит для хранения трехзначного числа? Не слишком ли много бит? - person ; 22.08.2011
comment
9,97 бит, а не 997. Но вам действительно нужно 10, потому что не существует такой вещи, как 0,97 бит. - person guardianpt; 23.08.2011
comment
Так это ',' в 9,97 или '.'? Разве это не должно быть '.' там? - person ; 23.08.2011
comment
Ну, это зависит от вашего региона, в Португалии мы используем «,» в качестве десятичного разделителя. Во всяком случае, я изменил его на '.' в моем ответе. - person guardianpt; 23.08.2011
comment
Я считаю, что правильная формула floor(log2(n)) + 1, в противном случае, например. результат для 1024 будет содержать 10, что неверно. ссылка на Википедию - person ubik; 13.08.2013
comment
@ubik На самом деле 10 бит достаточно для представления 1024 чисел (от 0 до 1023). Конечно, если вы хотите узнать количество битов, представляющих конкретное число, тогда эта формула верна. - person guardianpt; 14.08.2013
comment
@guardianpt, ты прав. Не обращайте внимания на мой комментарий, я неправильно понял вопрос. - person ubik; 14.08.2013
comment
@ubik: Ваша формула применима для подписанных номеров. - person Nagendra Nigade; 14.05.2016

Формула для количества двоичных битов, необходимых для хранения n целых чисел (например, от 0 до n - 1):

loge(n) / loge(2)

и округлить.

Например, для значений от -128 до 127 (байт со знаком) или от 0 до 255 (байт без знака) количество целых чисел равно 256, поэтому n равно 256, что дает 8 из приведенной выше формулы.

Для значений от 0 до n используйте n + 1 в приведенной выше формуле (существует n + 1 целых чисел).

На вашем калькуляторе loge может просто обозначаться как log или ln (натуральный логарифм).

person rghome    schedule 22.11.2016
comment
Спасибо, что дали простую формулу вместо длинного объяснения. Гораздо полезнее и по делу. - person ICW; 20.06.2018
comment
Если я не ошибаюсь, log₂(n) должно работать нормально. - person Danii; 24.11.2020
comment
Да, если на вашем калькуляторе есть кнопка log₂. - person rghome; 24.11.2020
comment
@Isaac Людям нужны объяснения, машинам без рассуждений нет. - person Eduardo Sebastian; 31.05.2021

Наибольшее число, которое может быть представлено n цифрами в системе счисления b, равно bn - 1. Следовательно, наибольшее число, которое может быть представлено N двоичными цифрами, равно 2N - 1. Нам нужно наименьшее целое N такое, что:

2N - 1 ≥ bn - 1
⇒ 2N ≥ bn

Логарифмирование по основанию 2 обеих частей последнего выражения дает:

log2 2N ≥ log2 bn
⇒ N ≥ log2 bn
⇒ N ≥ log bn / log 2

Поскольку нам нужно наименьшее целое N, удовлетворяющее последнему соотношению, чтобы найти N, найдите log bn / log 2 и возьми потолок.

В последнем выражении любое основание подходит для логарифмов, если оба основания одинаковы. Здесь удобно, поскольку нас интересует случай, когда b = 10, использовать логарифмы по основанию 10, используя преимущества log1010n< /sup> == п.

Для n = 3:

N = ⌈3 / log10 2⌉ = 10

Для n = 4:

N = ⌈4 / log10 2⌉ = 14

Для n = 6:

N = ⌈6 / log10 2⌉ = 20

И вообще, для n десятичных цифр:

N = ⌈n / log10 2⌉

person ad absurdum    schedule 19.07.2017
comment
Это хороший ответ. Я предлагаю указать, что log(10^n) == n, чтобы читатель не вычислял большое промежуточное число. - person wally; 08.03.2018
comment
@wally - это был хороший улов. Я не думал, что эти логарифмические функции имеют какое-либо конкретное основание, поскольку они были в соотношении, а b не обязательно равнялось 10 в выводе. Удобство выбора основания 10 просто ускользнуло от моего внимания. Обратите внимание, что log иногда означает log<sub>e</sub> или ln; Я особенно заметил это в старых справочниках по математике. - person ad absurdum; 08.03.2018
comment
Какое отличное объяснение. Спасибо. Ваш ответ заставил меня понять, насколько ужасным было объяснение в моей книге. - person peterchaula; 16.06.2019
comment
@питер - спасибо. Этот вопрос был старым, когда я опубликовал ответ пару лет назад; приятно знать, что кому-то это все еще было полезно;) - person ad absurdum; 17.06.2019
comment
Это обобщается на любую базу $q$ до базы $p$ - person Eduardo Sebastian; 31.05.2021

Хорошо, чтобы обобщить технику того, сколько битов вам нужно для представления числа, делается таким образом. У вас есть R символов для представления, и вы хотите узнать, сколько битов, решите это уравнение R=2^n или log2(R)=n. Где n — количество битов, а R — количество символов для представления.

Для десятичной системы счисления R = 9, поэтому мы решаем 9 = 2 ^ n, ответ составляет 3,17 бит на десятичную цифру. Таким образом, для трехзначного числа потребуется 9,51 бит или 10. Для 1000-значного числа требуется 3170 бит.

person jk3    schedule 20.07.2012
comment
Для десятичной системы R=10. Вам нужно 20 бит для 6-значных чисел, а не 19 или 3,32 бита на цифру. - person stark; 24.04.2013

Продолжайте делить число на 2, пока не получите частное 0.

person Arun    schedule 22.08.2011
comment
это неправильно - person Eduardo Sebastian; 31.05.2021

Самым простым ответом было бы преобразовать требуемые значения в двоичные и посмотреть, сколько бит требуется для этого значения. Однако вопрос спрашивает, сколько бит для десятичного числа X цифр. В этом случае кажется, что вам нужно выбрать наибольшее значение из X цифр, а затем преобразовать это число в двоичное.

В качестве базового примера предположим, что мы хотели сохранить однозначное число с основанием десять и хотели знать, сколько битов для этого потребуется. Самое большое однозначное число с основанием десять — это 9, поэтому нам нужно преобразовать его в двоичное число. Это дает 1001, что в общей сложности имеет 4 бита. Этот же пример можно применить к двузначному числу (с максимальным значением 99, которое преобразуется в 1100011). Чтобы решить n цифр, вам, вероятно, нужно решить остальные и найти закономерность.

Чтобы преобразовать значения в двоичные, вы многократно делите на два, пока не получите частное 0 (и все ваши остатки будут 0 или 1). Затем вы меняете порядок своих остатков, чтобы получить число в двоичном формате.

Пример: 13 в двоичном формате.

  • 13/2 = 6 р 1
  • 6/2 = 3 р 0
  • 3/2 = 1 р 1
  • 1/2 = 0 – 1
  • = 1101 ((8*1) + (4*1) + (2*0) + (1*1))

Надеюсь, это поможет.

person Cooper    schedule 22.08.2011
comment
Это работает для первых двух, но когда вы переходите к следующим двум вопросам, они достаточно велики, чтобы решить их по-своему. - person ; 22.08.2011

пусть требуется n бит, затем 2 ^ n = (база) ^ цифра, а затем возьмите журнал и подсчитайте нет. для п

person Gate Aspirant    schedule 24.01.2014

Для двоичного числа из n цифр максимальное десятичное значение, которое оно может содержать, будет

2 ^ n - 1, а 2 ^ n - это общее количество перестановок, которые можно сгенерировать, используя эти цифры.

Возьмем случай, когда вам нужны только три цифры, то есть ваш случай 1. Мы видим, что требования таковы,

2^n - 1 >= 999

Прикладывая бревно к обеим сторонам,

лог(2^n - 1) >= лог(999)

лог(2^n) - лог(1) >= лог(999)

n = 9,964 (приблизительно).

Взяв ceil значение n, поскольку 9,964 не может быть допустимым числом цифр, мы получаем n = 10.

person Prathik Rajendran M    schedule 20.02.2015

Предполагая, что вопрос заключается в том, какие минимальные биты необходимы для хранения

  1. 3-значный номер

Мой подход к этому вопросу будет следующим:

  • какое максимальное количество трехзначных чисел нам нужно хранить? Ответ: 999
  • какое минимальное количество битов требуется мне для хранения этого числа?

Эту проблему можно решить таким образом, разделив 999 на 2 рекурсивно. Однако проще использовать силу математики, чтобы помочь нам. По сути, мы решаем n для следующего уравнения:

2^n = 999
nlog2 = log999
n ~ 10

Вам понадобится 10 бит для хранения трехзначного числа.

Используйте аналогичный подход для решения других подвопросов!

Надеюсь это поможет!

person Arial    schedule 10.06.2015

Здесь много ответов, но я добавлю свой подход, так как я нашел этот пост, работая над той же проблемой.

Начиная с того, что мы знаем здесь, это числа от 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

Этот работает!

floor(loge(n) / loge(2)) + 1

Чтобы включить отрицательные числа, вы можете добавить дополнительный бит, чтобы указать знак.

floor(loge(abs(n)) / loge(2)) + 2
person Thiagesh thg    schedule 13.10.2018

Краткий ответ:

int nBits = ceil(log2(N));

Это просто потому, что pow(2, nBits) немного больше, чем N.

person Alex Tuduran    schedule 14.09.2019