31. Celé čísla a bity: DIV, MOD, TRUNC, FRAC, RAND, &, !, EXOR, HEX$, DEC
Na čo to je
V Atari BASICu sa celý podiel a zvyšok skladali z INT a delenia. Turbo-BASIC XL má na ne vlastné slová – a k nim funkcie na orezanie čísla, celé náhodné číslo, prácu s bitmi a šestnástkový zápis.
Ako sa to píše
| Zápis | Čo dá | Príklad | Výsledok |
|---|---|---|---|
A DIV B | celý podiel | 17 DIV 5 | 3 |
A MOD B | zvyšok po delení | 17 MOD 5 | 2 |
TRUNC(X) | odreže desatinnú časť (smerom k nule) | TRUNC(-2.7) | -2 |
FRAC(X) | len desatinná časť | FRAC(3.25) | 0.25 |
RAND(N) | náhodné celé číslo od 0 do N-1 | RAND(6) | 0 až 5 |
A & B | bitové „a“ | 12 & 10 | 8 |
A ! B | bitové „alebo“ | 12 ! 10 | 14 |
A EXOR B | bitové „buď – alebo“ | 12 EXOR 10 | 6 |
HEX$(N) | číslo šestnástkovo, ako text | HEX$(255) | FF |
DEC(A$) | šestnástkový text ako číslo | DEC("FF") | 255 |
DIV a MOD sú operátory – stoja medzi dvoma číslami ako + alebo * a majú rovnakú prednosť ako násobenie.
Celý program
Súbor examples/integers.tbas:
10 REM Whole numbers and bits
20 PRINT "17 DIV 5 = ";17 DIV 5
30 PRINT "17 MOD 5 = ";17 MOD 5
40 PRINT "TRUNC(-2.7) = ";TRUNC(-2.7);", INT(-2.7) = ";INT(-2.7)
50 PRINT "FRAC(3.25) = ";FRAC(3.25)
60 PRINT "12 & 10 = ";12&10
70 PRINT "12 ! 10 = ";12!10
80 PRINT "12 EXOR 10 = ";12 EXOR 10
90 PRINT "HEX$(255) = ";HEX$(255)
100 PRINT "HEX$(4096) = ";HEX$(4096)
110 PRINT "DEC of FF = ";DEC("FF")
120 PRINT "$10+$10 = ";$10+$10
130 FOR I=1 TO 10:PRINT RAND(6)+1;" ";:NEXT I
140 PRINTPreklad a spustenie
Basic26 integers.tbas --simČo uvidíš
17 DIV 5 = 3
17 MOD 5 = 2
TRUNC(-2.7) = -2, INT(-2.7) = -3
FRAC(3.25) = 0.25
12 & 10 = 8
12 ! 10 = 14
12 EXOR 10 = 6
HEX$(255) = FF
HEX$(4096) = 1000
DEC of FF = 255
$10+$10 = 32
5 3 1 6 3 3 6 1 2 6 (Posledný riadok je v simulátore vždy rovnaký, na Atari zakaždým iný.)
Ako to funguje
- Riadky 20 a 30: sedemnásť delené piatimi je 3, zvyšok 2.
N MOD 2je 0 pre párne a 1 pre nepárne číslo – najčastejšie použitieMOD. - Riadok 40:
TRUNCodreže desatinnú časť,INTide vždy nadol. Pri kladných číslach je to to isté, pri záporných nie. - Riadok 130:
RAND(6)+1je hod kockou – kratšie nežINT(RND(0)*6)+1.
Bity
Každé číslo 0 až 255 je v pamäti osem bitov – prepínačov, ktoré sú zapnuté (1) alebo vypnuté (0). Bity majú váhy 128, 64, 32, 16, 8, 4, 2 a 1; číslo je súčet váh zapnutých bitov.
12 = 8+4 = 0000 1100
10 = 8+2 = 0000 1010| Operácia | Bit výsledku je zapnutý, keď | 12 a 10 |
|---|---|---|
& | je zapnutý v oboch | 0000 1000 = 8 |
! | je zapnutý aspoň v jednom | 0000 1110 = 14 |
EXOR | je zapnutý práve v jednom | 0000 0110 = 6 |
Načo to je: veľa adries Atari drží v jednom bajte viac nastavení naraz, každé v inom bite. Bitovými operáciami sa dá jedno zmeniť a ostatné nechať:
100 X=PEEK(A)
110 POKE A,X!4:REM switch bit 2 on
120 POKE A,X&251:REM switch bit 2 off (251 = 255-4)
130 IF X&4 THEN PRINT "bit 2 is on"&, ! a EXOR pracujú s celými číslami 0 až 65535. Nepomýľ si ich s AND a OR: tie hovoria len „platí – neplatí“ (1 alebo 0).
Šestnástkové čísla
Jedna šestnástková číslica sú presne štyri bity, takže bajt sú vždy dve číslice: $FF je 255, $0C je 12. HEX$ vráti dve číslice pre čísla do 255 a štyri pre väčšie.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
DIV alebo MOD nulou | ERROR- 11 OVERFLOW AT LINE 10 |
HEX$ záporného čísla alebo nad 65535 | ERROR- 3 VALUE |
DEC textu, ktorý nie je šestnástkový | vráti 0 |
RAND(6) bez +1 | čísla 0 až 5 |
& namiesto AND v podmienke | IF A=1 & B=2 počíta s bitmi, nie s pravdou; píš AND |
-7 DIV 2 | je -3 (odreže sa k nule), zvyšok -7 MOD 2 je -1 |
Vyskúšaj si
- Vypíš čísla 1 až 30 a ku každému, či je deliteľné tromi.
- Vypíš číslo 0 až 255 dvojkovo: skúšaj
N&128,N&64…N&1. - Vypíš tabuľku čísel 0 až 15 desiatkovo a šestnástkovo.
Zhrnutie
DIVje celý podiel,MODzvyšok.TRUNCodreže desatinnú časť,FRACju vráti.RAND(N)je náhodné celé číslo 0 ažN-1.&,!,EXORpracujú s bitmi;AND,ORs pravdou.HEX$aDECprevádzajú medzi číslom a šestnástkovým textom.
Späť: 30. Procedúry a návestia · Ďalej: 32. Hľadanie v texte a klávesy