В Delphi используй операцию and, которая возвращает результат побитового
умножения. Пример a and $10 — выделить 4-ый бит. Если результат не ноль — бит
установлен.
То же самое, но на ассемблере. Это позволяет достичь максимальной скорости
выполнения.
function GetBites(t, Mask: LongWord): LongWord; asm
mov eax, t;
and eax, mask;
end;
Эта функция возвращает t and Mask. Если необходимо выполнить сдвиг, то
применяется команда shr:
function ShiftBites(t, Mask: LongWord; shift: byte): LongWord; asm
mov eax, t;
mov cl, shift;
shr eax;
and eax, Mask;
end;
Эта функция возвращает (t shr shift) and Mask. Если же ассемблер не поможет,
надо или переделывать алгоритм, или менять компьютер :))
Преобразование контента в русский язык:
Задача заключается в извлечении конкретных бит из байта информации с помощью операций над битами в Delphi.
В Delphi оператор and может использоваться для выполнения операции побитового И между двумя числами. Эта операция возвращает результат, где каждый бит установлен только если соответствующие биты обоих операндов равны 1. Это можно использовать для извлечения конкретных бит из байта информации.
Примером является выражение a and $10, которое извлекает 4-й бит (поскольку двоичное представление $10 равно 00001010). Если результат не равен нулю, то это означает, что 4-й бит был установлен в исходном значении.
Тот же принцип можно применить к ассемблерному языку. Код Delphi, предоставленный в примере, эквивалентен следующему коду на ассемблер:
function GetBites(t, Mask: LongWord): LongWord; asm
mov eax, t;
and eax, mask;
end;
Функция GetBites принимает два параметра LongWord, t и Mask, и возвращает результат выполнения операции побитового И между ними.
Функция ShiftBites аналогична, но также сдвигает биты t вправо на shift позиций перед выполнением операции побитового И:
Функция ShiftBites принимает три параметра t, Mask и shift, и возвращает результат сдвига t вправо на shift позиций и выполнения операции побитового И с Mask.
Если ассемблерный язык не является возможным или желаемым, то задачи можно выполнить с помощью встроенных операций над битами Delphi. Например:
function GetBites(t, Mask: LongWord): LongWord;
begin
Result := t and Mask;
end;
function ShiftBites(t, Mask: LongWord; shift: byte): LongWord;
begin
Result := (t shr shift) and Mask;
end;
Функции GetBites и ShiftBites, написанные на языке Pascal Delphi, эквивалентны ассемблерному коду, предоставленному в примере.
В статье описывается способ выделения бит информации в делиффи и на ассемблере с помощью операций bitwise AND и сдвига.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS