Delphi-Help

Работа с битова логика

  • размер на шрифта намалете размера на шрифта увеличете размера на шрифта
  • Печат

Двоична математика, работа с битова логика

Заедно с обичайните булеви операции с булеви типове, често е необходимо да се извършват операции с отделни битове, обикновено използвани като флагове. Разбирането на логическите операции е от съществено значение за ефективната работа.

Pascal поддържа следните логически операции

  • И - логично И;
  • ИЛИ - (включително) логическо ИЛИ;
  • XOR - (изключително) логическо ИЛИ;
  • NOT - отрицание или инверсия на бит;
  • SHL - логическа смяна наляво;
  • SHR - логическа смяна надясно.

Други логически операции с числата не са включени в Pascal, но са достъпни чрез асемблерни вложки.

Всеки бит може да има само две състояния FALSE или TRUE

Състоянието на малко може да бъде описано с други думи, някои от които идват от математиката, някои от електрониката, други от логиката.

За FALSE алтернативите са NONE, ZERO, DISABLED, NOT INSTALLED, CLEARED, FALSE, F, 0, - и други.

За TRUE алтернативите са YES, ONE, ON, INSTALLED, INCLUDED, TRUE, T, 1, + и други.

Нека разгледаме тези операции отделно.

И - логично И, тази операция изглежда така

Изразът е истина, когато и двата бита са истина. Поговорката "И там и там"

ИЛИ - (включително) логическо ИЛИ, тази операция изглежда така

Изразът е истина, когато поне един бит е истина. Поговорката "ИЛИ там ИЛИ там, включително и там и там"

XOR - (изключително) логично ИЛИ, тази операция изглежда така

Изразът е истина, когато само един бит е истина. Поговорката "ИЛИ там ИЛИ там, с изключение както там, така и там"

NOT - отрицание или инверсия на бит, тази операция се отнася само за един бит, действието на обикновената текуща стойност на бита е обърнато

SHL - логическа смяна наляво, операцията се отнася само за група битове, един от целочислените типове на Паскал, например байт, дума и т.н.

Shift байт наляво един бит.

Преместете байт наляво с две цифри.

Байтът се измества наляво с една или повече цифри, позициите вдясно се заменят с нули, позициите вляво се губят.

SHR - логическо изместване надясно, операцията се прилага само за група битове, един от целочислените типове на Паскал, например байт, дума и т.н.

Преместете байт надясно с един бит.

Преместете байт надясно с две цифри.

Байтът се измества надясно с една или повече цифри, позициите вляво се заменят с нули, позициите вдясно се губят.

Това завършва описанието на операциите и ние преминаваме към практически примери. Но първо, няколко думи за нотация

Нотация, използвана при показване на числа в литературата

Обичайно е цифрите да се показват в символна форма, така че най-малко значимите цифри да са вдясно, а линиите вляво и ако се използва подравняване, то също се подчинява на тези правила.

Номерирането на цифрите започва от нула в съответствие със степента на цифрата и се описва с формулата K * M ^ N, където K е коефициент в диапазона от 0 до M-1, M е основата на числото, и N е степента. Числото в степен 0 за всички бази е 1.

Нека разгледаме примера на следващата таблица за четири основни основи.

Основа

Стойност

Формула

1 * 10 ^ 2 + 0 * 10 ^ 1 + 0 * 2 ^ 0

1 * 16 ^ 2 + 0 * 16 ^ 1 + 0 * 2 ^ 0

Основа

Стойност

Формула

Невалидна комбинация

1 * 10 ^ 2 + 2 * 10 ^ 1 + 3 * 10 ^ 0

1 * 16 ^ 2 + 2 * 16 ^ 1 + 3 * 16 ^ 0

В началото ще бъдат разгледани няколко прости примера за използване на логически операции и в крайна сметка приложението на тези техники за работа с директории.

Получаване на позицията на бит или неговата стойност

В този пример, един се премества наляво с необходимия брой цифри и резултатът е двоична стойност, равна на 2 ^ N, където е зададен един единствен бит, съответстващ на цифрата на числото. Тази техника може да се използва с променлива за изчисляване на позицията по време на изпълнение или по време на компилация; във втория случай няма да се генерира код и компилаторът просто ще изчисли стойността и ще я замести в програмата, без да генерира допълнителен код. Това е полезно за посочване на битово число, без да се представя като десетична или шестнадесетична константа. Но по-често е по-удобно да се използват посочени константи, тъй като те са по-информативни, примери за това ще бъдат дадени в края на статията.

За задаване на единичен бит или група битове се използва операцията ИЛИ, използването се илюстрира от следния код като отделна функция и резултатът от изпълнението под формата на таблица.

Тук се случва следното:

Първо изчисляваме позицията на бита - (1 shl бит), след това задаваме получения бит и връщаме резултата чрез предварително дефинираната променлива Резултат.

Както можете да видите, независимо от началното състояние на бита, след извършване на операцията битовете стават равни на единица.

За изчистване на единичен бит или група битове се използва операцията И заедно с обратна маска, използването се илюстрира от следния код като отделна функция и резултатът от изпълнението под формата на таблица.

Тук се случва следното:

Първо изчисляваме позицията на бита - (1 shl бит), след това с помощта на операцията NOT обръщаме получената маска, като настройваме незасегнатите битове на маската на един, но засегнатия бит на нула, след това изчистваме този бит и резултатът се връща чрез предварително дефинираната променлива Result.

Както можете да видите, независимо от първоначалното състояние на бита, след завършване на операцията битът става равен на нула.

За превключване на единичен бит или група битове се използва изключителната операция ИЛИ, използването се илюстрира от следния код като отделна функция и резултатът от изпълнението под формата на таблица.

Тук се случва следното:

Първо изчисляваме позицията на бита - (1 shl бит), след това с помощта на операцията XOR превключваме бита и резултатът се връща чрез предварително дефинираната променлива Result.

Както можете да видите, състоянието на бит B2 се променя на противоположното.

За да проверите малко, използвайте операцията И и анализирайте резултата за равенство на нула.

най-често се използва в друга форма, вместо да се изчисли позицията, например се използва имената константа

Това е по-илюстративно, особено ако на константата е дадено по-смислено име от B2, например, за да проверим готовността на предавателя, можем да дефинираме константа с име TxReady, тогава ще изглежда много хубаво.

Е, сега приключихме с основата и е време да започнем по-полезни и практични примери. Като пример, нека изберем търсенето на папки и файлове. Примерът е разработен за често задавани въпроси конференция fido7.ru.delphi, по-късно е леко модернизиран според коментарите на Юрий Зотов. Пълният пример и останалите статии с често задавани въпроси са достъпни за изтегляне от моя сайт.

Помислете за ключовите моменти, свързани с тази статия.

Ето битова маска, описана в модула SysUtils, нейната стойност е равна на $ 3F, тя е предназначена да бъде включена в търсенето на специални файлове и в същото време да изолира допълнителни битове от структурата TSearchRec, отделни битове от това маска се описват като именувани константи.

Напишете защитени файлове

Файлове с идентификатор на тома

Архивни файлове (за система за архивиране)

Всички файлове са комбинация от горните флагове

тук виждаме проверката на флага faDirectory, той работи по следния начин, първо се изолират ненужните битове, след това се извършва проверка за неравенство на нула, тъй като всички други битове са изолирани, тогава са възможни само две стойности, нула, ако флагът не е зададен и не е зададена нула, в зависимост от резултата се изпълнява или частта THEN, или ELSE. В примера няма други неща по отношение на нашата статия и следователно няма какво повече да се разглежда. Други логически операции работят с логически, а не битови стойности.

В края на статията можете също да дадете примери за използване на маски за изолиране на битове и извършване на операции върху останалите битове, да вземете например всяка абстрактна комбинация от битове и да изпълнявате каквото и да е с тях.

Например, имаме такава структура на някакво устройство и когато данните пристигнат, настъпва прекъсване, чиято обработка отива при нашия манипулатор и други заедно със кода на състоянието, ако сме обработили съобщението, тогава трябва да върнем TRUE, ако тогава FALSE и след това контролата ще бъде предадена на следващия манипулатор във веригата. Не е необходимо да проверявате бита TxReady, контролът ще влезе само когато е зададен.

a - готов бит

b - бит за разрешаване на прекъсвания

ccc - вид операция

Битови грешки

Например, за да добавим битове, можем да използваме две опции или оператора + или оператора ИЛИ. Първият вариант е грешен.

AnyValue + 2, ако е зададен бит две, тогава в резултат на тази операция ще се осъществи прехвърляне към следващия бит и самият бит ще бъде изчистен, вместо да го задава, това може да се направи само ако има доверие в резултат, тогава ако първоначалната стойност е известна предварително. Но в случай на използване на опцията AnyValue или 2, тази грешка няма да възникне. Също така се отнася за операцията за изваждане, за да изчистите малко.

faAnyFiles - faDirectory няма да даде грешка, но AnyFlags - AnyBit може или не може да даде правилната опция. От друга страна, AnyFlags, а не AnyBit винаги ще ви даде това, което сте забравили, като тази техника ще бъде по-правилна за работа с файлови атрибути - faAnyFiles, а не faDirectory. За домашна работа опитайте да направите това на хартия за различни комбинации от ритми.

Друга често срещана грешка е логическата при извършване на операции върху групи битове. Например, неправилно е да се извършва операция за сравнение на следната конструкция AnyFlags и 5 <> 0, ако трябва да е вярно, когато са зададени и двата бита, трябва да напишете AnyFlags и 5 = 5, но ако е вярно, когато зададете някоя от битовете, изразът AnyFlags и 5 <> 0 ще бъдат верни.

Приложения

Таблица за претегляне на 32-битово число