2013-10-24 2 views
1

У меня есть новичок, пробирающийся через книгу Криса.Нужна разъяснение по побитовым операторам в Chris Rolliston XE2 Foundations Page 65

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

Может кто-нибудь объяснить, что подразумевается под этим, как пример, который следует, выглядит как что-то, что я типично делаю, я пытаюсь использовать лучшие практики.

+1

Можете вдаваться в подробности? Я предполагаю, что Крис сравнивал C-стиль побитовых AND и OR с целыми типами (например, стили окон или флаги создания процесса из Win32) с наборами Delphi. Но было бы лучше, если бы мы не догадались. Знаете ли вы, что такое сильная печать? Вы искали это с помощью веб-поиска? –

+2

У нас нет страницы 65 книги Криса перед нами. Замечательно, что Крис здесь и может объяснить, но это ужасный вопрос в целом. Как насчет запроса о синтаксисе вместо ссылки на страницу? –

ответ

1

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

const 
    mcFirst = 1; 
    ... 

против

type 
    TMyEnum = (meFirst, ... 

Крис предполагает использование перечисленных типов, а не константы, чтобы воспользоваться сильной типизации.

+0

Возможно, вы можете объяснить сильные проблемы с печатанием –

+0

Ahh, я получил это через несколько часов после того, как прочитал. Мое понимание - это перечисляемый тип, который может позволить радикальные изменения, сделав одно редактирование перечислимого типа. Спасибо, Тим С. –

9

Как я не могу посягать собственные авторские права, полный раздел:

Есть несколько мест в Delphi RTL - и много, много мест в Windows API, - где «битмаски» на целое число что-то вроде использования вместо заданных типов. Например, блок System.SysUtils объявляет функцию, FileGetAttr, которая возвращает атрибуты файла (только для чтения, скрытые, системные и т. Д.) В виде одного целого. Для проверки отдельных атрибутов, вы должны использовать так называемые «битовые» операторы, в частности and:

uses 
    System.SysUtils; 

var 
    Attr: Integer; 
begin 
    Attr := FileGetAttr('C:\Stuff\Some file.txt'); 
    if Attr and faReadOnly <> 0 then 
    WriteLn('Read only'); 
    if Attr and faHidden <> 0 then 
    WriteLn('Hidden'); 
    if Attr and faSysFile <> 0 then 
    WriteLn('System'); 
end. 

Для этой работы, то faXXX константы определены таким образом, что первый имеет значение 1, второе значение - 2, третье - 4, четвертое - 8 и т. д. Чтобы добавить значение к существующему руководству «набор», используйте or и удалить значение, используйте and not:

procedure AddHiddenAttr(const AFileName: string); 
begin 
    FileSetAttr(AFileName, FileGetAttr(AFileName) or faHidden); 
end; 

procedure RemoveHiddenAttr(const AFileName: string); 
begin 
    FileSetAttr(AFileName, FileGetAttr(AFileName) and not faHidden); 
end; 

В общем, вы должны использовать соответствующие типы наборов, где вы можете, так как они обеспечивают сильными типизации и большей читаемости. Тем не менее, следующий код демонстрирует тот факт, что под капотом, «настоящие» наборы и их руководство, эквиваленты C-типа сводятся к тому же:

const 
    mcFirst = 1; 
    mcSecond = 2; 
    mcThird = 4; 
    mcFourth = 8; 

type 
    TMyEnum = (meFirst, meSecond, meThird, meFourth); 
    TMySet = set of TMyEnum; 

var 
    UsingSet: TMySet; 
    UsingConsts: LongWord; 
begin 
    //direct assignment 
    UsingSet := [meSecond, meThird]; 
    UsingConsts := mcSecond or mcThird; 
    WriteLn('Equal? ', Byte(UsingSet) = UsingConsts); 
    //subtraction 
    Exclude(UsingSet, meSecond); 
    UsingConsts := UsingConsts and not mcSecond; 
    WriteLn('Equal? ', Byte(UsingSet) = UsingConsts); 
    //addition 
    Include(UsingSet, meFourth); 
    UsingConsts := UsingConsts or mcFourth; 
    WriteLn('Equal? ', Byte(UsingSet) = UsingConsts); 
    //membership test 
    if meThird in UsingSet then WriteLn('meThird is in'); 
    if UsingConsts and mcThird <> 0 then WriteLn('mcThird is in'); 
end. 

Запустите программу, и вы найдете TRUE выставляется в каждом случае.

Итак ... только что перечислив и присвоив типы, я теперь покрываю слабо типизированный эквивалент. Импликация бит в конце состоит в том, что, если вы привыкли определять простые битмаски в моделях C, нет никаких оснований избегать использования правильных типов наборов в Delphi, поскольку они сводятся к одному и тому же. Таким образом, вы не теряете никакой эффективности, так как вы получаете сильную типизацию - «сильная типизация» в этом контексте означает, что вы не можете случайно назначить или проверить элемент, предназначенный для другого типа набора.

+0

Видите, я знал, что вы вернетесь! Возможно, вы захотите использовать форматирование цитаты, а не курсив. –

+0

@DavidHeffernan - Сначала я использовал форматирование цитат, но затем был изменен на курсив, когда окончательный «и» в первом абзаце просто натолкнулся на предыдущий текст (форматирование цитаты использует серый фон, например, форматирование кода). –

+0

Я думаю, что это выглядит намного лучше. Нетрудно заметить код. И, на мой взгляд, это лучше ограничивает цитату из вашего заключительного пояснительного абзаца. –

Смежные вопросы