Niezrozumiała konstrukcja

0

Mam pewien algorytm dotyczacy mnozenia macierzy. Wszystko rozumie tylko w jezyku pascal nie pasuje mi jedna konstrukcja, dokladniej nie wiem dlaczego akurat tak musi byc.
Fragment algorytmu
"Dopóki k jest większe od zera, testujemy najmłodszy bit k i jeśli ma on wartość 1, to wykonujemy mnożenie W = W × A. Bity k przesuwamy o 1 w prawo, aby pozbyć się testowanego bitu. Jeśli po tej operacji k ma wartość 0, to potęgowanie jest zakończone i przerywamy pętlę"

a w jezyku pascal to jest

 
 while k > 0 do
  begin
    if k and 1 = 1 then  // testujemy najmłodszy bit k
    begin
      mnoz(n,W,A,P);     // jeśli ustawiony, to
      przepisz(n,P,W);   // W = W x A
    end;
    k := k shr 1;        // przesuwamy bity k w prawo
    if k = 0 then break; // jeśli brak bitów 1, przerywamy
    mnoz(n,A,A,P);       // A = A x A
    przepisz(n,P,A);
  end;

Nie rozumie linijki if k and 1 = 1 then

Co nam daje te porownanie 1 = 1 ? Bez tego program nie dziala.

0
if k and 1 = 1 then

W porównaniu do C++, gdzie wystarczyłoby napisać if (k&1), w Pascalu warunek musi być stricte typu boolean.
Po wykonaniu k and 1 pozostaje nam wartość o typie różnym, niż boolean, stąd musimy ją do czegoś porównać.
Można by także spróbować rzutowaniem:

if boolean(k and 1) then
0
Henox napisał(a):

Co nam daje te porownanie 1 = 1 ?
W tym wyrażeniu nie ma takiego porównania, kolejność operatorów jest inna, najpierw and później =.
Najpierw mamy k and 1, jest to iloczyn bitwy (nie logiczny!), obcina (zeruje) wszystkie bity oprócz bitu najmłodszego zostawiając go bez zmian. Wynikiem tego iloczynu jest liczba 0 lub 1 w zależności od tego co było bitem najmłodszym. Najmłodszy bit liczb parzystych wynosi 0, nieparzystych 1.

Można by to zapisać o wiele bardziej wymownie:

if (k mod 2) <> 0 then ...

//EDIT
Jeszcze mała uwaga co do wydajności, jeśli k będzie typu całkowitego bez znaku to wydajność obydwu będzie taka sama.

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