Использование побитовых операций 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование побитовых операций



Как уже говорилось, побитовые операции используются для обработки отдельных двоичных разрядов памяти. Для манипулирования отдельным битом необходимо научиться делать следующее:

· определять значение заданного бита;

· устанавливать значение заданного бита в значение 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: 0 0 … 0 0 0 0 0 0 0 0 0 0 0 1 = 1

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: 0 0 … 0 0 0 0 0 0 0 0 0 0 0 1 = 1

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: 0 0 … 0 0 0 0 0 0 0 0 0 0 0 1 = 1

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: 0 0 … 0 0 0 0 0 0 0 0 0 0 0 1 = 1

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: 0 0 … 0 0 0 0 0 0 0 0 0 0 0 1 = 1

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; просмотров: 141; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 35.175.174.36 (0.061 с.)