Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Установка определенного бита в слове

Delphi , Синтаксис , Память и Указатели



Автор: Григорий Ситнин
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
Возвращает AWord с установленным битом номер ABit (c 0 по 15) в значение 1,
если AState = TRUE или 0, если AState = FALSE.

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

Зависимости: System
Автор:       Григорий Ситнин, gregor@gregor.ru, Москва
Copyright:   Григорий Ситнин, 2003
Дата:        8 июля 2003 г.
***************************************************** }

function SetBit(AWord: word; ABit: byte; AState: boolean = true): word;
begin
  if AState then
    Result := AWord or (1 shl ABit)
  else
    Result := AWord and (not (1 shl ABit));
end;

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

{$APPTYPE CONSOLE}
program test;
uses Bits; // В модуле Bits описана функция SetBit
var
  z: word;
  i: integer;
  s: string;
begin
  z := 0;
  z := setbit(z, 0); // 0000000000000001
  z := setbit(z, 2); // 0000000000000101
  z := setbit(z, 9); // 0000001000000101
  z := setbit(z, 14); // 0100001000000101
  z := setbit(z, 15); // 1100001000000101
  s := '';
  for i := 15 downto 0 do
    s := s + inttostr(Ord(CheckBit(z, i)));
  writeln('value: ', z, ' dec = 1100001000000101');
  writeln('result: ', s);
  z := $FFFF;
  z := setbit(z, 0, false); // 1111111111111110
  z := setbit(z, 2, false); // 1111111111111010
  z := setbit(z, 9, false); // 1111110111111010
  z := setbit(z, 14, false); // 1011110111111010
  z := setbit(z, 15, false); // 0011110111111010
  s := '';
  for i := 15 downto 0 do
    s := s + inttostr(Ord(CheckBit(z, i)));
  writeln('value: ', z, ' dec = 0011110111111010');
  writeln('result: ', s);
end.

Программный пример на языке Delphi, демонстрирующий, как установить конкретный бит в слове. Функция SetBit принимает три параметра: AWord, которое является словом, где будет установлен бит; ABit, которое является номером бита, который должен быть установлен (от 0 до 15); и AState, которая определяет, должен ли бит быть установлен в 1 (TRUE) или 0 (FALSE).

Функция использует битовые операции для достижения этого. Если AState равен TRUE, она устанавливает бит на позиции ABit в AWord выполняя битовый операцию OR между AWord и маской, созданной с помощью оператора левого смещения (1 shl ABit). Это эффективно устанавливает бит на позиции ABit в 1. Если AState равен FALSE, она устанавливает бит на позиции ABit в AWord в 0 выполняя битовый операцию AND между AWord и той же маской, но с применением оператора NOT (not).

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

Альтернативное реализация функции SetBit, которая использует одиночную битову операцию:

function SetBit( AWord: word; ABit: byte; AState: boolean ): word;
begin
  Result := AWord + ( if AState then 1 else 0 ) shl ABit;
end;

Эта реализация использует тот факт, что в Delphi оператор + может использоваться для выполнения битовой добавления. Выражение (if AState then 1 else 0) эквивалентно условному выражению, которое возвращает либо 1, либо 0 в зависимости от значения AState. Это значение затем смещается влево на ABit позиций с помощью оператора shl, что эффективно устанавливает бит на позиции ABit в результат. Конечный результат присваивается переменной Result.

Обратите внимание, что эта реализация предполагает, что ABit является валидным индексом (т.е., между 0 и 15). Если вы хотите добавить проверку ввода для обеспечения того, что ABit находится в валидном диапазоне, вы можете модифицировать функцию следующим образом:

function SetBit( AWord: word; ABit: byte; AState: boolean ): word;
begin
  if ( ABit < 0 ) or ( ABit > 15 ) then
    raise ERangeError.Create('Invalid bit number');

  Result := AWord + ( if AState then 1 else 0 ) shl ABit;
end;

Эта реализация raisеs исключение диапазона ошибок, если ABit находится вне валидного диапазона от 0 до 15.

Функция SetBit для установки определенного бита в слове с использованием операций shift и bitwise или/и.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:28:03/0.0035450458526611/0