Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Лабораторная работа №4.

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

Цель: Научиться эффективно использовать операции с двоичным представлением чисел, получить практические навыки использования побитовых операций.

Теоретические сведения:

Наряду с обычными логическими операция над логическими типами Boolean, часто приходится выполнять операции и над отдельными битами, обычно используемыми, как флаги. Для эффективной работы необходимо понимание логических операций.

Паскаль поддерживает следующие логические операции

AND – логическое И;

OR - (включающие) логическое ИЛИ;

XOR - (исключающие) логическое ИЛИ;

NOT - отрицание или инверсия бита;

SHL – логический сдвиг влево;

SHR – логический сдвиг вправо.

Другие логические операции над числами в Паскаль не включены, но доступны через ассемблерные вставки.

Каждый бит может иметь только два состояния ЛОЖЬ (FALSE) или ИСТИНА (TRUE)

Состояние бита можно описывать и другими словами, часть которых пришла из математики, часть из электроники, часть из логики.

Для значения ЛОЖЬ, альтернативные варианты такие – НЕТ, НОЛЬ, ВЫКЛЮЧЕНО, НЕ УСТАНОВЛЕНО, СБРОШЕНО, FALSE, F, 0, - и другие.

Для значения ИСТИНА, альтернативные варианты такие – ДА, ЕДИНИЦА, ВКЛЮЧЕНО, УСТАНОВШЕНО, ВЗВЕДЕНО, TRUE, T, 1, + и другие.

Рассмотрим эти операции по отдельности

AND – логическое И, эта операции выглядит так

A

B

Y

0

0

0

0

1

0

1

0

0

1

1

1

Выражение истинно, когда истинны оба бита. Присказка «И там И там»

НЕ нашли? Не то? Что вы ищете?

OR - (включающие) логическое ИЛИ, эта операции выглядит так

A

B

Y

0

0

0

0

1

1

1

0

1

1

1

1

Выражение истинно, когда истинен хотя бы один бит. Присказка «ИЛИ там ИЛИ там, включая и там и там»

XOR - (исключающие) логическое ИЛИ, эта операции выглядит так

A

B

Y

0

0

0

0

1

1

1

0

1

1

1

0

Выражение истинно, когда истинен только один бит. Присказка «ИЛИ там ИЛИ там, исключая и там и там»

NOT - отрицание или инверсия бита, эта операции применяется только к одному биту, действие простое текущее значение бита изменяется на противоположное

A

Y

0

1

1

0

SHL – логический сдвиг влево, операции применяется только к группе битов, одного из целочисленных типов Паскаля, например к байту, слову и т. д.

Сдвиг байта влево на один разряд.

Разряды

B7

B6

B5

B4

B3

B2

B1

B0

До

1

0

0

1

1

1

0

1

После

0

0

1

1

1

0

1

0

Сдвиг байта влево на два разряда.

Разряды

B7

B6

B5

B4

B3

B2

B1

B0

До

1

0

0

1

1

1

0

1

После

0

1

1

1

0

1

0

0

Байт смещается влево на один или более разрядов, позиции справа замещаются нулями, позиции слева теряются.

SHR – логический сдвиг вправо, операции применяется только к группе битов, одного из целочисленных типов Паскаля, например к байту, слову и т. д.

Сдвиг байта вправо на один разряд.

Разряды

B7

B6

B5

B4

B3

B2

B1

B0

До

1

0

0

1

1

1

0

1

После

0

1

0

0

1

1

1

0

Сдвиг байта вправо на два разряда.

Разряды

B7

B6

B5

B4

B3

B2

B1

B0

До

1

0

0

1

1

1

0

1

После

0

0

1

0

0

1

1

1

Байт смещается вправо на один или более разрядов, позиции слева замещаются нулями, позиции справа теряются.

Применяемая нотация при отображении чисел в литературе

Числа в символьной форме принято отображать, так что бы младшие разряды были справа, а строки слева, при этом если используется выравнивание, то оно тоже подчиняется этим правилам.

Нумерация разрядов начинается с нуля в соответствии со степень разряда и описывается формулой K*M^N, где K это коэффициент в диапазоне от 0 до M-1, M это основание числа, а N это степень. Число в степени 0 для всех оснований равно 1.

Посмотрим на примере следующей таблицы для четырех основных оснований.

Для числа 100

Основание

Значение

Формула

2

4

1*2^2 + 0*2^1 +0*2^0

8

64

1*8^2 + 0*8^1 +0*8^0

10

100

1*10^2 + 0*10^1 + 0*2^0

16

256

1*16^2 + 0*16^1 + 0*2^0

Для числа 123

Основание

Значение

Формула

2

X

Не допустимая комбинация

8

83

1*8^2 + 2*8^1 + 3*8^0

10

123

1*10^2 + 2*10^1 + 3*10^0

16

291

1*16^2 + 2*16^1 + 3*16^0

Практические примеры

Получение позиции бита или его значения

1 shl N

В данном примере единица сдвигается влево на нужное количество разрядов, и в результате получаем двоичное значение, равное 2^N, где в установлен один единственный бит, соответствующий разряду числа. Этот прием может использоваться с переменной для расчета позиции во время выполнения или во время компиляции, во втором случае код генерироваться не будет, а компилятор просто рассчитает значение и подставит его в программу, не генерируя дополнительного кода. Это удобно для указания номера бита, не представляя его в виде десятичной или шестнадцатеричной константы. Но чаще бывает удобнее использовать именованные константы, поскольку они более информативны, примеры этого будут приведены в конце статьи.

Установка бита

Для установки отдельного бита или группы битов используется операция ИЛИ, использование иллюстрируется ниже приведенным кодом в виде отдельной функции и результатом выполнения в виде таблицы.

function SetBit(Src: Integer; bit: Integer): Integer;

begin

Result := Src or (1 shl Bit);

end;

Здесь происходит следующее:

Сначала мы рассчитываем позицию бита – (1 shl Bit), затем устанавливаем полученный бит и возвращаем результат через предопределенную переменную Result.

Пример использования:

DummyValue := SetBit(DummyValue, 2);

Разряды

B7

B6

B5

B4

B3

B2

B1

B0

До (1)

1

0

0

1

1

1

0

1

После

1

0

0

1

1

1

0

1

До (2)

1

0

0

1

1

0

0

1

После

1

0

0

1

1

1

0

1

Как видим, вне зависимости от начального состояние бита, после выполнения операции бит становится равны единице.

Сброс бита

Для сброса отдельного бита или группы битов используется операция И совместно с инверсной маской, использование иллюстрируется ниже приведенным кодом в виде отдельной функции и результатом выполнения в виде таблицы.

function ResetBit(Src: Integer; bit: Integer): Integer;

begin

Result := Src and not (1 shl Bit);

end;

Здесь происходит следующее:

Сначала мы рассчитываем позицию бита – (1 shl Bit), затем с помощью операции NOT инвертируем полученную маску, устанавливая, не затрагиваемые биты маски в единицу, а затрагиваемый бит в ноль, затем сбрасываем этот бит, а результат возвращаем результат через предопределенную переменную Result.

Пример использования:

DummyValue := ResetBit(DummyValue, 2);

Разряды

B7

B6

B5

B4

B3

B2

B1

B0

До (1)

1

0

0

1

1

1

0

1

После

1

0

0

1

1

0

0

1

До (2)

1

0

0

1

1

0

0

1

После

1

0

0

1

1

0

0

1

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

Переключение бита

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

function InvertBit(Src: Integer; bit: Integer): Integer;

begin

Result := Src xor (1 shl Bit);

end;

Здесь происходит следующее:

Сначала мы рассчитываем позицию бита – (1 shl Bit), затем с помощью операции XOR переключаем бит, а результат возвращаем результат через предопределенную переменную Result.

Пример использования:

DummyValue := InvertBit(DummyValue, 2);

Разряды

B7

B6

B5

B4

B3

B2

B1

B0

До (1)

1

0

0

1

1

1

0

1

После

1

0

0

1

1

0

0

1

До (2)

1

0

0

1

1

0

0

1

После

1

0

0

1

1

1

0

1

Как видим, состояние бита B2 изменяется на противоположное.

Проверка бита

Для проверки бита используется операция AND и анализ результата на равенство нулю.

if Value and (1 shl N) <> 0 then ... установлен

if Value and (1 shl N) = 0 then... не установлен

чаще всего это используется в другой форме, вместо расчета позиции используется именованная константа, например

const

B2 = 4 // B2 (1 shl 2)

Begin

if Value and B2 = B2 then... установлен

if Value and B2 = 0 then... не установлен

end;

Это более наглядно, особенно если константе дано более значимое имя, чем B2, например, для проверки готовности передатчика мы можем определить константу с именем TxReady, тогда это будет выглядеть очень красиво.

const

TxReady = 4

Begin

if Value and TxReady then begin

... обработка готовности передатчика

end;

end;

Ошибки при работе с битами

Например, для сложения бит мы можем использовать два варианта или операцию + или операцию OR. Первый вариант является ошибочным.

AnyValue + 2, если бит два установлен, то в результате этой операции произойдет перенос в следующий разряд, а сам бит окажется сброшенным вместо его установки, так можно поступать если только если есть уверенность в результате, то если заранее известно начальное значение. А вот в случае использования варианта AnyValue or 2, такой ошибки не произойдет. Тоже относится к операции вычитания для сброса бита.

Еще одна распростаненая ошибка, это логическая при выполнении операций над групами бит. Например неверено выполнять операцию сравнения над следующей конструкцией AnyFlags and 5 <> 0, если истина должна быть при установке обеих бит, надо писать так AnyFlags and 5 = 5, зато если устраивает истина при установке любого из бит, выражение AnyFlags and 5 <> 0 будет верныи.

Приложения

Таблица весовых множителей для 32 битного числа

Бит

Dec

Hex

Бит

Dec

Hex

Бит

Dec

Hex

Бит

Dec

Hex

0

1

1

8

256

100

16

65536

10000

24

1000000

1

2

2

9

512

200

17

131072

20000

25

2000000

2

4

4

10

1024

400

18

262144

40000

26

4000000

3

8

8

11

2048

800

19

524288

80000

27

8000000

4

16

10

12

4096

1000

20

1048576

100000

28

5

32

20

13

8192

2000

21

2097152

200000

29

6

64

40

14

16384

4000

22

4194304

400000

30

7

128

80

15

32768

8000

23

8388608

800000

31

Требования к оформлению отчета лабораторной работы:

Отчет должен содержать:

Тема и цель лабораторной работы. Краткие теоретические сведения. Задание на лабораторную работу, ее вычисление вручную и при помощи программы.

Варианты индивидуальных заданий:

Вариант №1.

В двухбайтовом шестнадцатиричном выражении FE40 & Ø (A2B1 Ú5D) Ù AEC
а). проверить, установлен ли 7-й или 11-й бит.
б). проверить, установлены ли 7-й и 11-й биты.
в). установить 4-й и 12-й биты, сбросить 3-й, 8-й и 13-й биты.
г). разложить результат на старший и младший байты.

Вариант №2.

В двухбайтовом шестнадцатиричном выражении F4A0 Ù (2FF1 ÚØ5A) & (Ø9EF)
а). проверить, установлен ли 8-й или 12-й бит.
б). проверить, установлены ли 8-й и 12-й биты.
в). установить 5-й и 13-й биты, сбросить 2-й, 7-й и 10-й биты.
г). разложить результат на старший и младший байты.

Вариант №3.

В двухбайтовом шестнадцатиричном выражении Ø E4AA Ú (2150 Ù599) & FAF
а). проверить, установлен ли 9-й или 10-й бит.
б). проверить, установлены ли 9-й и 10-й биты.
в). установить 6-й и 9-й биты, сбросить 3-й, 5-й и 14-й биты.
г). разложить результат на старший и младший байты.

Вариант №4.

В двухбайтовом шестнадцатиричном выражении 50AD Ù (Ø A290& 500D) Ú D000
а). проверить, установлен ли 2-й или 13-й бит.
б). проверить, установлены ли 2-й и 13-й биты.
в). установить 9-й и 10-й биты, сбросить 5-й, 9-й и 15-й биты.
г). разложить результат на старший и младший байты.

Вариант №5.

В двухбайтовом шестнадцатиричном выражении ABBA Ú Ø (AB ÙD698) & CACE
а). проверить, установлен ли 8-й или 1-й бит.
б). проверить, установлены ли 1-й и 8-й биты.
в). установить 8-й и 12-й биты, сбросить 5-й, 9-й и 10-й биты.
г). разложить результат на старший и младший байты.

Вариант №6.

В двухбайтовом шестнадцатиричном выражении CA4E & Ø (BBBB Ú 6A6A) Ù BAB
а). проверить, установлен ли 7-й или 11-й бит.
б). проверить, установлены ли 7-й и 11-й биты.
в). установить 4-й и 12-й биты, сбросить 3-й, 8-й и 13-й биты.
г). разложить результат на старший и младший байты.

Вариант №7.

В двухбайтовом шестнадцатиричном выражении FACE & (ØA781 Ú500) Ù BACE
а). проверить, установлен ли 5-й или 10-й бит.
б). проверить, установлены ли 5-й и 10-й биты.
в). установить 8-й и 12-й биты, сбросить 7-й, 9-й и 14-й биты.
г). разложить результат на старший и младший байты.

Вариант №8.

В двухбайтовом шестнадцатиричном выражении D1CE Ù Ø (E2E4 & E7E5) ÚC4C
а). проверить, установлен ли 5-й или 1-й бит.
б). проверить, установлены ли 1-й и 5-й биты.
в). установить 3-й и 6-й биты, сбросить 2-й, 9-й и 15-й биты.
г). разложить результат на старший и младший байты.