Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Использование побитовых операцийСодержание книги
Поиск на нашем сайте Как уже говорилось, побитовые операции используются для обработки отдельных двоичных разрядов памяти. Для манипулирования отдельным битом необходимо научиться делать следующее: · определять значение заданного бита; · устанавливать значение заданного бита в значение 0 или 1; · инвертировать значение заданного бита.
Это можно сделать так:
unsigned a = 1234; // Целое значение, битами которого мы будем управлять unsigned short n = 4; // Номер необходимого бита (от 0 до 31) bool r; // Значение результата (0 или 1)
/* Узнаем, чему равен n -й бит (двоичный разряд) значения a. Результат поместим в переменную r */ r = a & (1U << n); cout << "Разряд с номером " << n << " равен " << r << endl; // значение 1
/* Установим n -й бит (двоичный разряд) значения a в 0. Результат поместим в переменную а */ a = a & (~ (1U << n)); cout << "Значение а равно " << a << endl; // значение 1218 /* Проверяем */ r = a & (1U << n); cout << "Разряд с номером " << n << " равен " << r << endl; // значение 0
/* Возвращаем n -й бит (двоичный разряд) значения a в 1. Результат поместим в переменную а */ a = a | (1U << n); cout << "Значение а равно " << a << endl; // значение 1234 /* Проверяем */ r = a & (1U << n); cout << "Разряд с номером " << n << " равен " << r << endl; // значение 1
/* Инвертируем n -й бит (двоичный разряд) значения a. Результат поместим в переменную а */ a = a ^ (1U << n); cout << "Значение а равно " << a << endl; // значение 1218 /* Проверяем */ r = a & (1U << n); cout << "Разряд с номером " << n << " равен " << r << endl; // значение 0
/* Еще раз инвертируем n -й бит (двоичный разряд) значения a. Результат поместим в переменную а */ a = a ^ (1U << n); cout << "Значение а равно " << a << endl; // значение 1234 /* Проверяем */ r = a & (1U << n); cout << "Разряд с номером " << n << " равен " << r << endl; // значение 1
Изменяя значение переменной n в диапазоне от 0 до 31 можно выполнить все эти действия над любым битом переменной a какое бы значение она не содержала.
Таким образом, для того, чтобы узнать, чему равен двоичный разряд с номером n в значении переменной a, мы воспользовались выражением
a & (1U << n).
Иллюстрация вычисления этого выражения:
Номер разряда: 31 30 … 11 10 9 8 7 6 5 4 3 2 1 0
1U << n: 0 0 … 0 0 0 0 0 0 0 1 0 0 0 0 Значение a: 0 0 … 0 1 0 0 1 1 0 1 0 0 1 0 = 1234 a & (1U << n): 0 0 … 0 0 0 0 0 0 0 1 0 0 0 0 = 16
Результатом вычисления этого выражения является целое значение не равное 0. Операция присваивания этого значения логической переменной r автоматически преобразует целое значение 16 в логическое значение true (т.е. 1). Если бы значение a имело бы разряд с номером 4 равным 0, то результатом вычисления этого выражения было бы значение 0. При выполнении операции присваивания это значение было бы преобразовано в логическое значение false (т.е. 0).
Для установки значения разряда с номером n в переменной a в значение 0 используется выражение
a & (~ (1U << n)).
Иллюстрация вычисления этого выражения:
Номер разряда: 31 30 … 11 10 9 8 7 6 5 4 3 2 1 0
1U << n: 0 0 … 0 0 0 0 0 0 0 1 0 0 0 0 ~ (1U << n): 1 1 … 1 1 1 1 1 1 1 0 1 1 1 1 Значение a: 0 0 … 0 1 0 0 1 1 0 1 0 0 1 0 = 1234 a & (1U << n): 0 0 … 0 1 0 0 1 1 0 0 0 0 1 0 = 1218
Для установки значения разряда с номером n в переменной a в значение 1 используется выражение
a | (1U << n).
Иллюстрация вычисления этого выражения:
Номер разряда: 31 30 … 11 10 9 8 7 6 5 4 3 2 1 0
1U << n: 0 0 … 0 0 0 0 0 0 0 1 0 0 0 0 Значение a: 0 0 … 0 1 0 0 1 1 0 0 0 0 1 0 = 1218 a | (1U << n): 0 0 … 0 1 0 0 1 1 0 1 0 0 1 0 = 1234
Для инвертирования значения разряда с номером n в переменной a используется выражение
a ^ (1U << n).
Иллюстрация вычисления этого выражения при a = 1218:
Номер разряда: 31 30 … 11 10 9 8 7 6 5 4 3 2 1 0
1U << n: 0 0 … 0 0 0 0 0 0 0 1 0 0 0 0 Значение a: 0 0 … 0 1 0 0 1 1 0 0 0 0 1 0 = 1218 a ^ (1U << n): 0 0 … 0 1 0 0 1 1 0 1 0 0 1 0 = 1234
Но, если a = 1234, то:
Номер разряда: 31 30 … 11 10 9 8 7 6 5 4 3 2 1 0
1U << n: 0 0 … 0 0 0 0 0 0 0 1 0 0 0 0 Значение a: 0 0 … 0 1 0 0 1 1 0 1 0 0 1 0 = 1234 a ^ (1U << n): 0 0 … 0 1 0 0 1 1 0 0 0 0 1 0 = 1218
В C++ имеются и другие средства работы с отдельными битами, но они будут рассмотрены позже.
|
||
|
Последнее изменение этой страницы: 2017-02-07; просмотров: 224; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.198 (0.007 с.) |