FORTH
Úvod Výukové lekce  02 03 04 


   Lekce 3 - Logické a binární operace


   Logické operace pracují s dvouhodnotovými parametry podle Booleovy algebry, logickou jedničkou, TRUE a logickou nulou, FALSE.
TRUE je nenulová hodnota, do zásobníku se ukládá jako číslo 1 nebo -1 (FFFF). FALSE se ukládá jako 0.
Binární operace pracují s bity celého slova, posouvají je, provádí logické operace s jednotlivými bity.

Příklad 4: Na následujícím Obr. 4 jsou prakticky vyzkoušeny některé logické a binární operace v F-PC .
 
FPC04
Obr. 4
FALSE
( -- false)

false logická hodnota false   na TOS se uloží 0
Např. FALSE .  zobrazí 0
false
TRUE ( -- true) true logická hodnota true   na TOS se uloží FFFF
Např. TRUE .  zobrazí -1
true
= (x1 x2 -- fl)
x-libovolné 16b číslo
fl-logický příznak
equals x1=x2, pak true   porovná x1 a x2, pokud se rovnají, výsledek je TRUE.
x1 a x2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 3 = .  porovná 5 a 3, nerovnají se, zobrazí 0, (FALSE).
Např. 5 5 = .  porovná 5 a 5, rovnají se, zobrazí -1, (TRUE).
equals
<> (x1 x2 -- fl) not equals x1<>x2, pak true   porovná x1 a x2, pokud se nerovnají, výsledek je TRUE.
x1 a x2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 3 <> .  porovná 5 a 3, nerovnají se, zobrazí -1, (TRUE).
Např. 5 5 <> .  porovná 5 a 5, rovnají se, zobrazí 0, (FALSE).
not-equals
< (n1 n2 -- fl)
n-16b se znaménkem
less-than n1<n2, pak true   porovná n1 a n2, pokud hodnota NOS<TOS, výsledek je TRUE.
n1 a n2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 3 < .  porovná 5 a 3, 5<3, zobrazí 0, (FALSE).
Např. 5 5 < .  porovná 5 a 5, 5<5, zobrazí 0, (FALSE).
less
> (n1 n2 -- fl) greater-than n1>n2, pak true   porovná n1 a n2, pokud hodnota NOS>TOS, výsledek je TRUE.
n1 a n2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 3 > .  porovná 5 a 3, 5>3, zobrazí -1, (TRUE).
Např. 5 5 > .  porovná 5 a 5, 5>5, zobrazí 0, (FALSE).
greater
0= (x -- fl) zero-equals x=0, pak true   pokud je x nulové, výsledek je TRUE.
x se vyčte ze zásobníku, na TOS se uloží logická hodnota.
0= neukládá 0 do zásobníku, je rychlejší než 0  =
Např. 3 0= .  porovná 3 a 0, nerovnají se, zobrazí 0, (FALSE).
Např. 0 0= .  porovná 0 a 0, rovnají se, zobrazí -1, (TRUE).
zero-equals 
0<> (x -- fl) zero-not-equals x<>0, pak true   pokud je x nenulové, výsledek je TRUE.
x se vyčte ze zásobníku, na TOS se uloží logická hodnota.
Např. 3 0<> .  porovná 3 a 0, nerovnají se, zobrazí -1, (TRUE).
Např. 0 0<> .  porovná 0 a 0, rovnají se, zobrazí 0, (FALSE).
zeroneq
0< (n -- fl) zero-less x<0, pak true   pokud je x menší než nula, výsledek je TRUE.
x se vyčte ze zásobníku, na TOS se uloží logická hodnota.
Např. 3 0< .  porovná 3 a 0, 3<0, zobrazí 0, (FALSE).
Např. 0 0< .  porovná 0 a 0, 0<0, zobrazí 0, (FALSE).
zero-less
0> (n -- fl) zero-greater x>0, pak true   pokud je x větší než nula, výsledek je TRUE.
x se vyčte ze zásobníku, na TOS se uloží logická hodnota.
Např. 3 0> .  porovná 3 a 0, 3>0 se, zobrazí -1, (TRUE).
Např. 0 0> .  porovná 0 a 0, 0>0, zobrazí 0, (FALSE).
zero-greater
U< (u1 u2 -- fl)
u-16b bez znaménka
u-less-than u1<u2, pak true   porovná u1 a u2, pokud hodnota NOS<TOS, výsledek je TRUE.
u1 a u2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 50000 30000 U< .  porovná, 50000<30000, zobrazí 0, (FALSE).
Např. 50000 30000 < .  přeteče 50000 do záporných čísel, zobrazí -1, (TRUE).
u-less
U> (u1 u2 -- fl)

u-greater-than u1>u2, pak true   porovná u1 a u2, pokud hodnota NOS>TOS, výsledek je TRUE.
u1 a u2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 50000 30000 U> .  porovná, 50000>30000, zobrazí -1, (TRUE).
Např. 50000 30000 > .  přeteče 50000 do záporných čísel, zobrazí 0, (FALSE).
u-greater
D= (d1 d2 -- fl)
d-32b se znaménkem
d-equals d1=d2, pak true   porovná d1 a d2, pokud hodnota d1=d2, výsledek je TRUE.
d1 a d2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 1 3 1 D= .  porovná, 65541=65539, zobrazí 0, (FALSE).
Např. -5 -1 -5 -1 D= .  porovná, -5=-5, zobrazí -1, (TRUE).
d-equals
D< (d1 d2 -- fl) d-less-than d1<d2, pak true   porovná d1 a d2, pokud hodnota d1<d2, výsledek je TRUE.
d1 a d2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 1 3 1 D< .  porovná, 65541<65539, zobrazí 0, (FALSE).
Např. -5 -1 -3 -1 D< .  porovná, -5<-3, zobrazí -1, (TRUE).
d-less
D0= (d -- fl) d-zero-equals d=0, pak true   pokud je d nulové, výsledek je TRUE.
d se vyčte ze zásobníku, na TOS se uloží logická hodnota.
Např. 3 1 0= .  porovná 65539 a 0, 65539<>0, zobrazí 0, (FALSE).
d-zero-equals
D0< (d -- fl) d-zero-less d<0, pak true   pokud je d menší než nula, výsledek je TRUE.
d se vyčte ze zásobníku, na TOS se uloží logická hodnota.
Např. 3 1 0< .  porovná 65539 a 0, 65539<0, zobrazí 0, (FALSE).
Např. -3 -1 0< .  porovná, -3 a 0, -3<0, zobrazí -1, (TRUE).
d-zero-less
DU< (ud1 ud2 -- fl)
ud-32b bez znaménka
d-u-less ud1<ud2, pak true   porovná ud1 a ud2, pokud hodnota ud1<ud2, výsledek je TRUE.
ud1 a ud2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 1 3 1 DU< .  porovná, 65541<65539, zobrazí 0, (FALSE).
d-u-less
AND (x1 x2 -- x3)
x-libovolné 16b číslo
and x3=x1 and x2  logický součin dvou 16-bitových čísel, výsledek je 16-bitové číslo.
x1 a x2 se vyčtou ze zásobníku, na TOS se uloží x3.
Např. hex 13 05 AND .  provede 13 and 05, zobrazí výsledek 1.
and
OR (x1 x2 -- x3) or x3=x1 or x2  logický součet dvou 16-bitových čísel, výsledek je 16-bitové číslo.
x1 a x2 se vyčtou ze zásobníku, na TOS se uloží x3.
Např. hex 13 05 OR .  provede 13 or 05, zobrazí výsledek 17.
xor
XOR (x1 x2 -- x3) xor x3=x1 xor x2  exclusive or dvou 16-bitových čísel, výsledek je 16-bitové číslo.
x1 a x2 se vyčtou ze zásobníku, na TOS se uloží x3.
Např. hex 13 05 XOR .  provede 13 xor 05, zobrazí výsledek 16.
xor
INVERT (x1 -- x2) invert x2=not x1  zinvertuje bity 16-b čísla, 0 na 1, 1 na 0, výsledek je 16-bitové číslo.
x1 se vyčte ze zásobníku, na TOS se uloží x2.
Např. hex 13 INVERT .  zinvertuje 13, zobrazí výsledek EC.
invert
WITHIN (n1 n2 n3 -- fl)
n1-16b se znaménkem
within n2<=n1<n3   porovná n1 s n2, n3, pokud n1 leží mezi n2, n3 výsledek je TRUE.
n1, n2, n3 se vyčtou ze zásobníku, na TOS se uloží logická hodnota.
Např. 5 3 6 WITHIN .  porovná, 3<=5 a 5<6, 5 leží mezi 3 a 6, zobrazí -1, (TRUE).
Např. 1 3 6 WITHIN .  porovná, 3<=1 a 1<6, 1 neleží mezi 3 a 6, zobrazí 0, (FALSE).
within
MIN (n1 n2 -- n3) min n3=menší z n1, n2  porovná n1 a n2, menší uloží na TOS.
n1, n2 se vyčtou ze zásobníku, na TOS se uloží n3.
Např. 5 3 MIN  .  porovná, 3 je menší než 5, zobrazí výsledek 3.
min
MAX (n1 n2 -- n3) max n3=větší z n1, n2  porovná n1 a n2, větší uloží na TOS.
n1, n2 se vyčtou ze zásobníku, na TOS se uloží n3.
Např. 5 3 MAX  .  porovná, 5 je větší než 3, zobrazí výsledek 5.
max
DMIN (d1 d2 -- d3) d-min d3=menší z d1, d2  porovná d1 a d2, menší uloží na TOS.
d1, d2 se vyčtou ze zásobníku, na TOS se uloží d3.
Např. 5 1 3 1 DMIN  D.  porovná, 65539 je menší než 65541, zobrazí výsledek 65539.
d-min
DMAX (d1 d2 -- d3)
d-max d3=větší z d1, d2  porovná d1 a d2, větší uloží na TOS.
d1, d2 se vyčtou ze zásobníku, na TOS se uloží d3.
Např. 5 1 3 1 DMAX  D.  porovná, 65541 je větší než 65539, zobrazí výsledek 65541.
d-max
LSHIFT (x1 u -- x2)
x-libovolné 16b číslo
u-16b bez znaménka
l-shift Logický posun vlevo  posune číslo x1 o u-bitů vlevo, nejnižší bit doplní nulou.
x1, u se vyčtou ze zásobníku, na TOS se uloží x2.
Např. hex 13 2 LSHIFT .  dvakrát posune vlevo, 13, 26, 4C, zobrazí výsledek 4C.
l-shift
RSHIFT (x1 u -- x2) r-shift Logický posun vpravo  posune číslo x1 o u-bitů vpravo, nejvyšší bit doplní nulou.
x1, u se vyčtou ze zásobníku, na TOS se uloží x2.
Např. hex 13 2 RSHIFT .  dvakrát posune vpravo, 13, 9, 4, zobrazí výsledek 4.
r-shift
____________________________________________________________________________________________________________________
21.01.2008 - Luboš Pěkný, čerpáno z  X3J14 dpANS-6.