С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.70
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
#1

Разбить файл на биты - C++

09.02.2012, 17:04. Просмотров 4993. Ответов 17
Метки нет (Все метки)

Каким образом осуществить разбиение файла на биты, а потом ещё его желательно будет и собрать.
Пока, собственно вопроса по коду нету, нужны лишь направления в правильную сторону.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 17:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разбить файл на биты (C++):

Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат - C++
нужна помощь в битовых операциях.Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат.

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ... - C++
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая получает 1)случайное целое типа int,...

Как преобразовать файл в биты (в нули и единицы), чтобы потом можно было его зашифровать в код Грея? - C++
Добрый день всем! У меня к вам несколько вопросов, которые касаются следующего: В институте дали задание сделать программу которая...

Разбить файл на части - C++
вот недавно изучил тему про fstream такая задача, нужно разбить файл на столько частей на сколько пожелает пользователь. к примеру...

Разбить файл на текст и числа - C++
2.Дан текстовый файл. В каждом его строке первые 30 позиций отводятся под текст, а оставшаяся часть - под действительное число. Создать два...

Разбить текстовый файл на страницы - C++
Мне было задано 3 задачи две я решил, а вот одну не могу помогите пожалуйста. Постановка задачи: Я должен откыть текстовый файл, потом...

17
NoMasters
Псевдослучайный
1765 / 1107 / 74
Регистрация: 13.09.2011
Сообщений: 3,149
09.02.2012, 17:11 #2
В общем-то он и так разбит на биты, в двоичном виде храниться же... Читаешь по байту, рассматриваешь в нём биты.
0
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 17:27 #3
Цитата Сообщение от NoMasters Посмотреть сообщение
рассматриваешь в нём биты.
Для этого следует использовать класс std::bitset<>.
1
Байт
Нарушитель
Эксперт C
16695 / 10959 / 1688
Регистрация: 24.12.2010
Сообщений: 21,379
09.02.2012, 18:27 #4
cetrael, А Байт на Биты разбивается так
C
1
2
3
4
5
char B, Out[8];
for(i=0; i<8; i++) {
  k = ((B>>i)&1);
  Out[i] = k;
}
Добавлено через 57 секунд
По себе знаю
1
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 19:35 #5
Если писать на простом Си - да, но на C++ следует использовать std::bitset<>.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <bitset>
 
using namespace std;
 
typedef unsigned char byte;
int main()
{
    cout << "Enter a byte [0..255]" << endl;
    unsigned int buffer;
    cin >> buffer; cin.get();
    byte myByte = static_cast<byte>(buffer);
    bitset<8> myBits(myByte);
    cout << "Bits: ";
    for (int i = 0, N = myBits.size(); i < N; ++i)
        cout << myBits[N - i - 1];
    cin.get();
}
2
retmas
09.02.2012, 20:23
  #6

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Байт на Биты разбивается так

По себе знаю
неплохо сказал

0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
09.02.2012, 21:08 #7
Цитата Сообщение от Сtrl Посмотреть сообщение
но на C++ следует использовать std::bitset<>
Почему это следует? Особенно если учесть, что вариант из поста #4 даже в пересчёте на полезные команды занимает меньшее количество кода
2
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:20 #8
Цитата Сообщение от Evg Посмотреть сообщение
Почему это следует? Особенно если учесть, что вариант из поста #4 даже в пересчёте на полезные команды занимает меньшее количество кода
Интересно вы это полезные команды считаете. Если отделить фрагмент, аналогичный коду из сообщения #4, то вот:
C++
1
2
unsigned char myByte;
bitset<8> myBits(myByte);
Теперь сравнение имеет смысл. Добавьте только экономию памяти (ее использование в std::bitset<> оптимизировано), типобезопасность и отсутствие всего того множества проблем, возникающих при работе с массивами. Ня?
0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
09.02.2012, 21:25 #9
Цитата Сообщение от Сtrl Посмотреть сообщение
поскольку у меня код больше лишь потому, что там целая программа
Специально для тебя написал ведь "даже в пересчёте на полезные команды"

Цитата Сообщение от Сtrl Посмотреть сообщение
Вот теперь сравнение имеет смысл
Нет, сравнение смысла не имеет. Оно будет иметь смысл когда ты к своему коду допишешь процесс извлечения битов из своего bitset'а. А пока твой код эквивалентент Си'шному коду

C
1
2
unsigned char myByte;
unsigned char myBits = myByte;
0
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:30 #10
Цитата Сообщение от Evg Посмотреть сообщение
Нет, сравнение смысла не имеет. Оно будет иметь смысл когда ты к своему коду допишешь процесс извлечения битов из своего bitset'а.
С позиции пользователя этот код идентичен (операция индексации). А с точки зрения реализации... Вы что, правда не знаете про инкапсуляцию, или шутите?
0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
09.02.2012, 21:39 #11
Цитата Сообщение от Сtrl Посмотреть сообщение
Вы что, правда не знаете про инкапсуляцию, или шутите?
Если честно, не понял, при чём тут компиляция в свете спора обязательности использовать bitset

Добавлено через 1 минуту
Цитата Сообщение от Сtrl Посмотреть сообщение
Добавьте только экономию памяти (ее использование в std::bitset<> оптимизировано), типобезопасность и отсутствие всего того множества проблем, возникающих при работе с массивами. Ня?
Вообще мы тут работаем не с массивами а с единичным байтом (ведь вся речь шла о том, что файл читаем побайтно, а затем выдираем из него биты)
0
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 21:43 #12
Цитата Сообщение от Evg Посмотреть сообщение
Если честно, не понял, при чём тут компиляция в свете спора обязательности использовать bitset
Как бы как только вы начали говорить об аналогичном коде на чистом Си - вы полезли в дебри реализации. Да, по сути там выходит вышеуказанное присваивание из char в char, даже дополнительные накладные расходы есть. Но это же черный ящик - какая разница, что внутри? Библиотечный класс предоставляет специальный интерфейс для работы с битами, в отличие от обычного массива char[8].
Цитата Сообщение от Evg Посмотреть сообщение
Вообще мы тут работаем не с массивами а с единичным байтом
С массивами. Или следующая строка такая неброская?
C
1
char B, Out[8]
0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
09.02.2012, 22:01 #13
Цитата Сообщение от Сtrl Посмотреть сообщение
С массивами. Или следующая строка такая неброская?
Давай возьмём твой пример (отбросив ненужное)

C++
1
2
3
4
byte myByte = ...;
bitset<8> myBits(myByte);
for (i = 0; i < N; i++)
  cout << myBits[N - i - 1];
и приведём к такому же виду вариант на Си

C
1
2
3
unsigned char myByte = ...;
for (i = 0; i < N; i++)
  cout << ((myByte >> i) & 1);
Зачем нам хранить промежуточные значения? Речь ведь не идёт об обработке битов. Речь идёт только о том, чтобы разобрать файл и собрать. Т.е. (условно говоря) читаем из одного файла (или потока) побайтно и пишем в другой файл (или поток) побитно. Либо я не так понял постановку задачи

А если всё-таки нужно хранить в памяти всю информацию о битах, то я как-то в описании bitset'а не нашёл, как, например, создать bitset размером в миллион бит и загнать туда 125 тыщ байт
0
Сtrl
139 / 129 / 3
Регистрация: 19.07.2011
Сообщений: 184
09.02.2012, 22:14 #14
Цитата Сообщение от Evg Посмотреть сообщение
Зачем нам хранить промежуточные значения? Речь ведь не идёт об обработке битов. Речь идёт только о том, чтобы разобрать файл и собрать. Т.е. (условно говоря) читаем из одного файла (или потока) побайтно и пишем в другой файл (или поток) побитно. Либо я не так понял постановку задачи
Мне кажется, что не так, ибо иначе разбиение на биты вообще смысла не имеет. Для обыкновенного вывода на экран я нахожу ваш способ достаточным. Но зачем отказываться от универсальности и гибкости кода, экономя при этом пару байт?
Цитата Сообщение от Evg Посмотреть сообщение
А если всё-таки нужно хранить в памяти всю информацию о битах, то я как-то в описании bitset'а не нашёл, как, например, создать bitset размером в миллион бит и загнать туда 125 тыщ байт
Загнать откуда? Из потока, из массива? В обоих случаях алгоритм тривиален (да прибудет с вами Google).
0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
09.02.2012, 22:21 #15
Цитата Сообщение от Сtrl Посмотреть сообщение
Но зачем отказываться от универсальности и гибкости кода, экономя при этом пару байт?
Я ж не отказываюсь. Я всего лишь пытаюсь оспорить слово "следует", которое в данном контексте можно трактовать как какую-то обязаловку.

Цитата Сообщение от Сtrl Посмотреть сообщение
Загнать откуда? Из потока, из массива? В обоих случаях алгоритм тривиален
Да пофиг откуда. Из описания я вижу, что заполнять большой bitset можно только побитно, но не побайтно
0
09.02.2012, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 22:21
Привет! Вот еще темы с ответами:

Разбить файл на равные части - C++
Подскажите пожалуйста, как разбить файл с содержимым, средствами с++ на равные части(последний кусок может быть меньше) я нашел на...

Разбить файл на строки длиной не более 60 символов - C++
Проблема в том, что функция, работает не корректно... А вот понять в чем проблема я чет не могу... (Хотя есть ощущение, что функция...

биты - C++
помогите пожалуйста написать программу которая переведет натуральное число в двоичною систему исчесления и выведет на экран

Задача на биты. - C++
Здраствуйте. С++ начал изучать недавно. И возникла проблема с решением задачи на биты. Вот собственно сама задача. Пока я выучил только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.