Работа с битами
В явном виде битовых множеств в языке 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; |
- Подробности
- Родительская категория: Язык программирования Дельфи
- Категория: Работа с битами