Размер двоичного представления числа

0

Мы обычно говорим, что число 5 может быть представлено как 3 битное двоичное число. Но, если мы преобразуем 5 в его двоичное представление, то есть 101 и напечатаем его в текстовый файл, он фактически занимает 3 байта, поскольку он читается как массив символов. Как я могу создать файл (не обязательно текстовый файл), чтобы размер этого файла составлял 3 бита?

  • 4
    Тебе нельзя. Файловая система хранит файлы в байтах, а не в битах.
  • 0
    Таким образом, невозможно представить 5 менее чем 1 байт?
Показать ещё 3 комментария
Теги:
file
binary
computer-science

4 ответа

3
Лучший ответ

Вы можете логически представить 5 как три бита, но ни файловая система, ни система управления памятью (для ОЗУ) не позволят вам адресовать пространство в единицах меньше одного байта.

Если бы у вас было восемь из этих чисел, вы могли бы упаковать их в 24 бит = 3 байта и сохранить их "эффективно" в памяти или файле. Эффективно в кавычках, потому что, сохраняя какое-то пространство, становится сложно работать с упакованными данными, так как вам нужно много смещать вещи. Инструкции CPU, загрузки памяти, индексирование массива и т.д. Не работают с менее чем байтовыми единицами.

Самый практичный способ - просто использовать целый байт для трех бит и жить с накладными расходами.

1

Я не думаю, что вы получите файловую систему, которая сообщит вам, что файл имеет 3 бита. Он будет по крайней мере байт, плюс память для дополнительной информации о файле.

Но вы можете просто открыть файл для записи и написать 3 как двоичный файл.

FILE *ptr;

ptr = fopen("file", "wb");

fwrite('a', 1, 1, ptr);
1

Вы можете использовать следующий код и работать на основе этого... следующий код хранит три числа (5, 3 и 2) в одном байте. для хранения 3 чисел файл занимает только один байт. в общем случае мы не можем хранить данные в частичных байтах в файлах.

#include<stdio.h>
struct bits
{
       unsigned char first:3,second:3,third:2;
};
main()
{
    struct bits b;
    FILE *f;
    b.first=5;
    b.second=3;
    b.third=2;

    printf("\ninitial data:%u %u %u",b.first,b.second,b.third);

    /*storing in file*/
    f=fopen("bitsfile","w");
    fwrite(&b,sizeof(b),1,f);
    fclose(f);

    /*reading back from file*/
    f=fopen("bitsfile","r");
    fread(&b,sizeof(b),1,f);
    fclose(f);

    printf("\ndata read from file:%u %u %u",b.first,b.second,b.third);
}
0

Обычно вы не можете, поскольку бинарные файлы имеют минимальный "квант", который является байтом (8 бит). Есть что-то интересное в сохранении символов с не однородной длиной бита с использованием кодирования Хаффмана. Просто объясните, прежде чем читать полную статью: ваши символы алфавита остаются на каждом бинарном листе дерева. Существует один путь 1 (т.е. слева) 0 (т.е. справа), начиная с корня и приземляющегося на ваш символ. Если дерево не сбалансировано (и это будет), разные символы могут быть представлены однозначно с разной длиной бита. конечно, есть некоторые усилия, потому что вы должны всегда читать файл на уровне байтов, а затем распаковывать и обрабатывать биты с реализацией вашего алгоритма.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню