obecność bitu, set of w pliku

0
const
  duzy     = $01;
  szeroki  = $02;
  wysoki   = $04;
  kolorowy = $08;
  szybki   = $10;

{...}

wyglad := duzy or kolorowy or szybki

{...}

if (wyglad and duzy) = duzy then ... - tak sprawdzałem obecnosć bitu w wyglad, ale jest na to jakis lepszy sposób? Główkuje i główkuje, ale nic mi nie przychodzi do głowy.
(potrzebuje to do zapisu w pliku wiec nie ma mowy o set of ...)
Pozdrawiam [browar]

0

Lepszego raczej nie ma. Jest inny :

if (wygla and duzy) <> 0 then

ale jak widzisz różnica jest niewielka

Też dawno temu się nad tym zastanawiałem, ale nic lepszego nie wymysliłem.

Operacje matematyczne odpadają, bo mają na nie wpływ też pozostałe bity.

0

Porównanie do zera jest w tym momencie szybszym sposobem, bowiem omija się w Assemblerze przynajmniej 1 instrukcję a nawet i więcej - zależy od tego, jak pobierana jest zmienna.

Ale tu ciekawostka, bo na nowszych procesorach (Pentium II+) może się okazać (ale wcale nie musi), że to właśnie ten dłuższy kod będzie się wykonywal szybciej. Kwestia sparowania kolejnych instrukcji.

Jednak jest to różnica taktu procesora. Polecam porównać do zera i tyle.

0

A co masz przeciwko zbiorom w plikach?

type
  TAttr = (duzy, szeroki, wysoki, kolorowy, szybki);

var
  q: set of TAttr;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  w: Pointer;
begin
  q := [duzy, szeroki];
  w := @q;
  ShowMessage(IntToStr(Integer(w^)));
end;
0

AHA !! [glowa] przeciez set moge sobie przekonwerowac normalnie na int.
Kurde, a w drugą strone ?

0
type
  TAttr = (duzy, szeroki, wysoki, kolorowy, szybki);
  TSet = set of TAttr;

var
  q: TSet;

....

procedure TForm1.Button1Click(Sender: TObject);
var
  w: Pointer;
  e: Integer;
begin
  e := 2;
  w := @e;
  q := TSet(w^);
  if szeroki in q then
    ShowMessage('sfaf');
end;

Jakby ktoś był ciekaw, to zarówno szeroki in q, jak i (szeroki and q) <> 0 (gdy q jest typu Integer) Delphi zamieani na:
test ptr [q], 02h :)

// Mmmmmm, piękne rzeźbienie w kodzie, jak za dawnych dobrych czasów w TP... - ŁF

0

Też tak zrobiłem, tylko sie zraziłem tym, że po ponownej konwersji na int wychodziło 318652418 i myslałem że jest źle. A jednak jest to porawne, ta liczba wynika pewnie ze struktury set of, której do końca nie zrozumiałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1