Как видим, вне зависимости от начального состояние бита, после выполнения операции бит становится равны единице.
Сброс бита Для сброса отдельного бита или группы битов используется операция И совместно с инверсной маской, использование иллюстрируется ниже приведенным кодом в виде отдельной функции и результатом выполнения в виде таблицы. 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;