Если каждая цифра представлена одним
байтом таблицы ASCII, то
можно закодировать в меньшее количество
байтов.
Например, возьмем число 12345678901. В нем 11 цифр. Если представить каждую цифру соответствующим кодом таблицы ASCII (код на языке Ruby)
n=12345678901
n.to_s.each_codepoint {|c| print c, ' ' }
Получаем вывод последовательности
49 50 51 52 53 54 55 56 57 48 49 => "12345678901"
То есть последовательность хранится в памяти неоптимально.
Теперь посмотрим как выглядит число в виде последовательности битов:
puts n.to_s(2) # конвертация в строку по двоичной системой счисления
Вывод:
1011011111110111000001110000110101
Лень считать вручную:
puts n.to_s(2).size
Получили число 34.
34 = 4 * 8 + 2
То есть 4 целых байта и 2 бита.
Фактический размер последовательности для хранения в памяти - 5 байтов.
То есть 11 байтов числа представлены 5-ю байтами.
bytes = [n].pack('w') # кодирование числа в BER.
Вывод:
=> "\xAD\xFE\xF0\xB85"