Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2009, 07:41   #1
dmitmal
 
Регистрация: 17.04.2009
Сообщений: 5
По умолчанию Работа с битами в C

Здравствуйте!
Не знаю, как правильно написать программу, которая бы считывала блок данных из файла (1000 бит), инвертировала некоторые биты и записывала этот же блок в другой файл.
Работать с файлами могу, но только побайтово. Если даже посимвольно считать, то как достучаться до конкретного бита из 1000, ведь это уже будет массив из 125 элементов?
dmitmal вне форума Ответить с цитированием
Старый 16.05.2009, 07:54   #2
radiohobbyt
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 38
По умолчанию

смотри дискретную математику.
или вот тут посмотреть можешь http://ru.wikipedia.org/wiki/Битовые_операции

инвертирование по маске
BYTE x=чтототам;
BYTE mask=маска;//где 0-там не инвертируется, где 1-инвертируется
x=x^mask;

а конкретный бит узнать можно так
BYTE x=чтототам;
BYTE xbit;//=) типа BYTE потому что нету битового типа(bool вообще это int=))
xbit=(x>>(номер бита))&1;
radiohobbyt вне форума Ответить с цитированием
Старый 16.05.2009, 10:08   #3
Cakeinpanic
Пользователь
 
Аватар для Cakeinpanic
 
Регистрация: 10.05.2009
Сообщений: 21
По умолчанию

x&(1<<n)
будет 0, если на n+1 месте справа в x стоит 0 и не 0 если 1(нужно для ифов)
x^(1<<n)
поставит на это место 1 если там был 0 и 0, если была 1
x|(1<<n)
поставит на это место 1
Cakeinpanic вне форума Ответить с цитированием
Старый 18.05.2009, 14:34   #4
dmitmal
 
Регистрация: 17.04.2009
Сообщений: 5
По умолчанию

to radiohobbyt:
Цитата:
инвертирование по маске
BYTE x=чтототам;
BYTE mask=маска;//где 0-там не инвертируется, где 1-инвертируется
x=x^mask;
То есть, если мне надо инвертировать 526-й бит в файле, мне надо будет считать этот файл в массив типа char, потом взять 526/8=~66-й элемент и на него наложить маску 65*8=520; 526-520=6 => mask=4 (00000100) ??
dmitmal вне форума Ответить с цитированием
Старый 18.05.2009, 21:17   #5
radiohobbyt
Пользователь
 
Регистрация: 28.03.2009
Сообщений: 38
По умолчанию

Нет...это значит, что на элемент массива типа char номер 526/8 надо наложить маску 1<<(526%8)

Последний раз редактировалось radiohobbyt; 18.05.2009 в 21:47.
radiohobbyt вне форума Ответить с цитированием
Старый 20.05.2009, 04:27   #6
dmitmal
 
Регистрация: 17.04.2009
Сообщений: 5
По умолчанию

Спасибо! Попытаюсь разобраться =)
dmitmal вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. 0101 Помощь студентам 3 17.12.2009 23:57
Работа с битами kesha2008 Общие вопросы C/C++ 2 24.02.2009 12:05