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íkladVýsledok
A DIV Bcelý podiel17 DIV 53
A MOD Bzvyšok po delení17 MOD 52
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-1RAND(6)0 až 5
A & Bbitové „a“12 & 108
A ! Bbitové „alebo“12 ! 1014
A EXOR Bbitové „buď – alebo“12 EXOR 106
HEX$(N)číslo šestnástkovo, ako textHEX$(255)FF
DEC(A$)šestnástkový text ako čísloDEC("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:

Turbo Basic XL
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 PRINT

Preklad 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

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áciaBit výsledku je zapnutý, keď12 a 10
&je zapnutý v oboch0000 1000 = 8
!je zapnutý aspoň v jednom0000 1110 = 14
EXORje zapnutý práve v jednom0000 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ť:

Turbo Basic XL
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 nulouERROR- 11 OVERFLOW AT LINE 10
HEX$ záporného čísla alebo nad 65535ERROR- 3 VALUE
DEC textu, ktorý nie je šestnástkovývráti 0
RAND(6) bez +1čísla 0 až 5
& namiesto AND v podmienkeIF A=1 & B=2 počíta s bitmi, nie s pravdou; píš AND
-7 DIV 2je -3 (odreže sa k nule), zvyšok -7 MOD 2 je -1

Vyskúšaj si

  1. Vypíš čísla 1 až 30 a ku každému, či je deliteľné tromi.
  2. Vypíš číslo 0 až 255 dvojkovo: skúšaj N&128, N&64 … N&1.
  3. Vypíš tabuľku čísel 0 až 15 desiatkovo a šestnástkovo.

Zhrnutie

Späť: 30. Procedúry a návestia · Ďalej: 32. Hľadanie v texte a klávesy