Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Обработка задач на ЭВМ на GPSS + Пояснительная записка
Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка

Манипулирование битами в пограммировании
Зачем вообще нужно манипулировать битами? Ведь многие из нас предпочли бы этого не делать. “Возня с битами” относится к низкому уровню и открывает возможности для ошибок, поэтому, если у нас есть альтернатива, следует использовать ее. Однако биты настолько важны и полезны, что многие программисты не могут их игнорировать. Это может звучать довольно грозным и обескураживающим предупреждением, но оно хорошо продумано.

Также вам может показаться, что такая тема как http://kabelremont1.narod.ru/ никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт kabelremont1.narod.ru
Тема паяльное оборудование ремонт кабельной линии там представлена весьма широко.


Некоторые люди действительно любят возиться с битами и байтами, поэтому следует помнить, что работа с битами иногда необходима (и даже может принести удовольствие), но ею не следует злоупотреблять. Процитируем Джона Бентли: “Люди, развлекающиеся с битами, будут биты” (“People who play with bits will be bitten”).
Иногда они являются естественными объектами нашей предметной области, поэтому естественными операциями в таких приложениях являются операции над битами. Примерами таких приложений являются индикаторы аппаратного обеспечения (“влаги”), низкоуровневые коммуникации (в которых мы должны извлекать значения разных типов из потока байтов), графика (в которой мы должны составлять рисунки из нескольких уровней образов) и кодирование (подробнее о нем — в следующем посте).
Для примера рассмотрим, как извлечь (низкоуровневую) информацию из целого числа (возможно, из-за того, что мы хотим передать его как набор байтов через двоичный механизм ввода-вывода).
void f(short val) // пусть число состоит из 16 битов, т.е. 2 байтов {
unsigned char left = val>>8; // крайний левый
// (самый старший) байт unsigned char right = val&0xff; // крайний правый
// (самый младший) байт
// . . .
bool negative = val&0x8000; // знаковый бит
// . . .
}
Такие операции не редкость. Они известны как “сдвиг и наложение маски” (“shift and mask”). Мы выполняем сдвиг (“shift”), используя операторы << или >>, чтобы переместить требуемые биты вправо (в младшую часть слова), где ними легко манипулировать. Мы накладываем маску (“mask”), используя оператор “и” (&) вместе с битовой комбинацией (в данном случае 0xff), чтобы исключить (установить равными нулю) биты, нежелательные в результате.
При необходимости именовать биты часто используются перечисления. Рассмотрим пример.
enum Printer_flags { acknowledge=1, paper_empty=1<<1, busy=1<<2, out_of_black=1<<3, out_of_color=1<<4,
// . . .
};
Этот код определяет перечисление, в котором каждый элемент равен именно тому значению, которому соответствует его имя.
out of color 16 0х10 0001 0000
out of black 8 0х8 0000 1000
busy 4 0х4 0000 0100
paper empty 2 0х2 0000 0010
acknowledge 1 0х1 0000 0001
Такие значения полезны, потому что они комбинируются совершенно независимо друг от друга.
unsigned char х = out_of_color | out_of_black; // x = 24 (16+8) х |= paper_empty; // x = 2 6 (24+2)
Отметим, что оператор |= можно прочитать как “установить бит” (или “установить некоторый бит”). Значит, оператор & можно прочитать как “установлен ли бит?” Рассмотрим пример.
if (х& out_of_color) { // установлен ли out_of_color? (Да, если
// установлен)
// . . .
}
Оператор & по-прежнему можно использовать для наложения маски. unsigned char y = х &(out_of_color | out_of_black); // y = 24
Теперь переменная y содержит копию битов из позиций 4 и 4 числа х (out_of_color и out_of_black).
Очень часть переменные типа enum используются как набор битов. При этом необходимо выполнить обратное преобразование, чтобы результат имел вид перечисления. Рассмотрим пример.
// необходимо приведение
Flags z = Printer_flags(out_of_color | out_of_black);

Приведение необходимо потому, что компилятор не может знать, что результат выражения out_of_color | out_of_black является корректным значением переменной типа Flags. Скептицизм компилятора обоснован: помимо всего прочего, ни один из элементов перечисления не имеет значения, равного 24 (out_of_ color | out_of_black), но в данном случае мы знаем, что выполненное присваивание имеет смысл (а компилятор — нет).
Опубликовал katy April 26 2015 11:42:00 · 0 Комментариев · 3724 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
HtmlLerz PRO
Нестандартные при...
FilesInfo
RAS
Редактор анимаций
DCMintry
Exe in exe
PHP/MySQL для нач...
Дешифратор содерж...
Популярные загрузки
Разработка клиент...
Проигрыватель Mp3
Архив значков
Алгоритм DES шифр...
Delphi и технолог...
Domen Name IP
PHP/MySQL для нач...
Базы данных в Инт...
NetGraph [Исходни...
DelTrayIcon [Исхо...

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98017
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14239
Borland Delphi ... 10374
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Основная особеннос...
Удаление хвостовой...
Планирование за не...
Специализации шаблона
Теперь покажем, ка...
В современных сист...
Глава 5
Приложение Модуль ...
Комбинирование соб...
В здании несколько...
ХАКАЕМ АПОРТ
количество элемент...
Google-продвижение...
СУБД mySQL
Связывание текстов...
LINITIAL (ИНИЦИАЛИ...
Рабочие нагрузки
Листинг 15.12. Бре...
Класс SimpleList
Как расколоть орешек
Генерация программ...
Ключи
Первая попытка зап...
клиентом удаленног...
PHP - Простое кэши...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?