Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
21 ошибка прогр... 64862
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

База данных электронного документооборота на Delphi + бд Intebase
Моделирование работы ЭВМ на GPSS + Пояснительная записка
Двунаправленный динамический список на Delphi + Блок схемы

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

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

Также вам может показаться, что такая тема как 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 Апрель 26 2015 14:42:00 · 0 Комментариев · 2244 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Delphi7 Для профе...
Усложнённый кальк...
DragMe [Исходник ...
Progressbar
Пример создания W...
Х. М. Дейтел, П. ...
TrayIcon
Панель Календарь
Прграммирование в...
IPAddresseEdit
BDEPack
CodeGear RAD Stud...
Архив программ
Delphi. Готовые а...
C# 2005 и платфор...
Киллер окон
mp3tag
SendSMS для PHP-F...
FreeSMS v1.3.1
DAlarm

Топ загрузок
Приложение Клие... 100620
Delphi 7 Enterp... 94318
Converter AMR<-... 20149
GPSS World Stud... 16288
Borland C++Buil... 13575
Borland Delphi ... 9559
Turbo Pascal fo... 7177
Калькулятор [Ис... 5397
Visual Studio 2... 5075
FreeSMS v1.3.1 3592
Случайные статьи
Модальные формы
Необходимость испо...
tld.• Разрешите вы...
Указатель "примеча...
Заказчик
URL целевой страницы
Ordinal expression...
Искажения образа т...
Игровой клуб Космолот
почтовым сервером,...
Глонасс установка
• L2TP не содержит...
Взаимодействие с п...
Протоколы распреде...
Написанный вручную...
Графические редакт...
Событие OnDragDrop
Декартовое произве...
Играть онлайн бесп...
Скрипт показа банн...
Виртуальные методы...
Работа в отрыве от...
Форматированный ввод
Некоторые дополнит...
Что такое Thunders...
Статистика



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


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