В явном виде битовых множеств в языке Object Pascal нет. Но вместо этого можно использовать обычные множества, которые на самом деле и хранятся как битовые. Если множество вам нужно для проверки, установлен ли какой то бит в слове 

Code:

type

PByteSet = ^TByteSet;

TByteSet = setof Byte;

var

W: Word;

...

{ если бит 3 в слове W установлен, тогда ... }

if3in PByteSet(@W)^ then ...

...

 С Delphi 2.0 появился специальный класс TBitSet, который ведет себя как битовое множество.Для Delphi 1.0 вы можете написать такой класс самостоятельно.

 

https://delphiworld.narod.ru/

DelphiWorld 6.0

 

Двоичная математика.

Введение

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

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

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

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

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

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

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

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

 

Пример чтения данных по битовой маске из значения:

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

{©Drkb v.3(2007): www.drkb.ru}

const

Col: Word = $ABCD;

var

R,

G,

B: Byte;

begin

R := Byte(Col shr8) div8; // первые 5 бит

G := ((Byte(Col shr8) and$7) * 8) or (Byte(Col) div$20); // Вторые 6 бит

B := Byte(Col) and$1F; // третьи 5 бит

end;

  Автор ответа: Rouse_ 

Взято из https://forum.sources.ru

В Delphi используй операцию and, которая возвращает результат побитового умножения. Пример a and $10 — выделить 4-ый бит. Если результат не ноль — бит установлен.

 

То же самое, но на ассемблере. Это позволяет достичь максимальной скорости выполнения.

 

Code:

function GetBites(t, Mask: LongWord): LongWord;

asm

mov eax, t;

and eax, mask;

end;

 

Проверка - установлен ли определенный бит?

 

Code:

function IsBitSet(Value: cardinal; BitNum : byte): boolean;

{©Drkb v.3(2007): www.drkb.ru}

begin

result:=((Value shr BitNum) and1) = 1

end;

...

if IsBitSet(43691,1) then//установлен (равен 1)

 

 

Есть два способа.

 Низкоуровневый подход обеспечивается логическими операциями : 

Code:

var

I : integer;

N : integer; // Номер бита в диапазоне от 0..SizeOf(TYPE)*8 - 1

begin

I := I or (1 shl N); // установка бита

I := I andnot (1 shl N); // сброс бита

I := I xor (1 shl N); // инверсия бита

if (i and (1 shl N)) <> 0 then... // проверка установленного бита

end;

 

Установка бита в единицу

 

Code:

function BitOn(const val: longint; const TheBit: byte): LongInt;

{©Drkb v.3(2007): www.drkb.ru}

begin

Result := val or (1shl TheBit);

end;

 

 Переключение состояния бита с единицы на ноль и наоборот

 

Code:

function BitToggle(const val: longint; const TheBit: byte): LongInt;

{©Drkb v.3(2007): www.drkb.ru}

begin

Result := val xor (1shl TheeBit);

end;

 

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

Code:

function BitOff(const val: longint; const TheBit: byte): LongInt;

{©Drkb v.3(2007): www.drkb.ru}

begin

Result := val and ((1shl TheBit) xor$FFFFFFFF);

end;

 

 Автор ответа: s-mike 

 

Взято из https://forum.sources

 

Code:

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Получение значения бита в двойном слове

 

Функция возвращает значение бита с номером Index в двойном слове Value

 

Зависимости: нет

Автор: Dimka Maslov, mainbox@ endimus. ru, ICQ:148442121, Санкт-Петербург

Copyright: Dimka Maslov

Дата: 21 мая 2002 г.

***************************************************** }

 

function Bit(Value, Index: Integer): Boolean;

asm

bt eax, edx

setc al

and eax, 0FFh

end;