Kristoffer Eriksson
<5357>
· Text 6972 · w8 · kommentar
1987-06-13 23:05
Ärende: Logiska operationer (XOR, AND, OR...)
Du kan väl det binära talsystemet?
Alla tal lagras ju binärt i datorn. AND, XOR, OR osv arbetar
på bittarna i dessa talens binära form. De tar i princip två
bittar indata och ger en bitt som resultat, vilket visas i
"sanningstabeller" typ:
In Ut
A B A AND B
0 0 0
0 1 0
1 0 0
1 1 1
dvs, om man har 1 AND 1 blir resultatet 1. Nu finns det ju 16
bittar i varje heltal i Basic, så Basicens AND parar ihop bittarna
två och två, en från vardera talet på motsvarande bitpositioner,
i 16 par, och ger 16 resultatbitts som sätts ihop på motsvarande
sätt till resultatet. (CPU:ns AND-instruktion fungerar också på det
sättet, fast med bra 8 bittar i taget, så det är inte så svårt.)
Basicen gör alltså en bittvis AND-operation på alla bittarna i
vardera argumentet.
12 AND 9 = 8:
12(Dec) = 1100 (Bin)
AND 9(Dec) = 1001 (Bin)
--------------------
= 8(Dec) = 1000 (Bin)
Effekten av X AND 127 blir att bitt 7 (den åttonde bitten räknat
från den minst värda) i X maskas bort och blir alltid noll, medan
de andra passerar oförändrade. 127(Dec)=01111111(Bin). Man ser i
sanningstabellen ovan att när A är 1, blir resultatet hela tiden
samma som B (det går även att kasta om A och B, det blir samma
sak), så ettor i masken (127) släpper igenom bittarna i X
oförändrade.
AND används alltså ofta till att maska ut vissa bittar ur ett tal.
OR används ofta till att ett-ställa vissa bittar.
XOR används ofta till att invertera vissa bittar.
NOT inverterterar alla bittar (dvs växlar nollor och ettor).
Jag skriver "ofta", för man behöver ju inte betrakta det ena
argumentet som mask, och det andra som data, särskilt inte när man
kombinerar flera bitt-operatorer efter varandra.
Om man nu inte är intresserad av att behandla 16 bittar
individuellt i egrumenten, låter man ofta alla bittarna vara lika,
så üratt talen blir 0 eller -1. Då kan man tänka på AND, OR osv
mer som det kanske står i manualen, till att förbinda villkor i
IF-satser, t ex IF Q<1 AND Z=2 THEN ... Här fungerar ju inte den
ena av jämförelserna som mask, utan hela villkoret blir sannt om
båda jämförelserna är sanna, vilket också kan utläsas ur
sanningstabellen ovan.
(Man kan även använda bara lägsta bitten i argumenten och låta
resten vara noll, så de får värdena 0 och 1 i stället för -1.)
Paritetsbitten kan användas i protokoll för att upptäcka
överföringsfel. Stämmer inte paritetsbitten på mottagna data begär
man omsändning på något sätt som spcificeras av protokollet. Utan
protokoll struntar man oftast i att kolla pariteten, eller ev
skippar felaktiga tecken. OBS, att bitt 7 inte behöver vara
liktydigt med "paritetsbitten". Man kan ha åtta databittar, och en
ev paritetsbitt därtill, och i så fall ska du inte maska åttonde
bitten.