QBASIC - Rutiner - Binære - Binær konvertering

Qbasic kan håndtere hexadecimale tal med VAL() og HEX$() - på denne måde:

h$ = "9D"
PRINT h$; " = "; VAL("&H" + h$)
h% = 157
PRINT h%; " = "; HEX$(h%)

9D = 157
 
157 = 9D

- men der er ingen tilsvarende understøttelse af binære tal.

 

Funktionen bins(b$)konverterer fra binært tal (angivet som en tekst-streng) til decimalværdi - fx:

b$ = "10011101"
PRINT b$; " = "; bins(b$)

10011101 = 157

Funktionen bin$(b%)konverterer fra decimalværdi til binært tal (angivet som en tekst-streng) - fx:

b% = 157
PRINT b%; " = "; bin$(b%)

157 = 10011101

 

Konverteringen udføres her på to måder: i Qbasic og i Assembler (ca 10 gange hurtigere)

 

Binær konvertering - Qbasic

DECLARE FUNCTION bin$ (b%)
DECLARE FUNCTION bins% (b$)
 
b$ = "10011101"
PRINT b$; " = "; bins(b$)

10011101 = 157
b% = 157
PRINT b%; " = "; bin$(b%)

157 = 10011101
Funktioner
FUNCTION bins% (b$)
  n& = 0: p& = 1
  FOR b% = LEN(b$) TO 1 STEP -1
    IF MID$(b$, b%, 1) = "1" THEN
      n& = n& + p&
    END IF
    p& = p& + p&
  NEXT
  bins% = CVI(MKL$(n&))
END FUNCTION
 
FUNCTION bin$ (W%)
  b$ = "                "
  n& = &HFFFF& AND b%
  FOR i% = 16 TO 1 STEP -1
    IF n& AND 1 THEN
      MID$(b$, i%) = "1"
    ELSE
      MID$(b$, i%) = "0"
    END IF
    n& = n& \ 2
    IF n& = 0 THEN EXIT FOR
  NEXT
  bin2$ = LTRIM$(b$)
END FUNCTION

 

Binær konvertering - Qbasic + Assembler

Basic-koden gox.gif (837 bytes)Assembler-koden til bin.bin og bins.bin
DECLARE SUB Init ()
DECLARE FUNCTION bin$ (b%)
DECLARE FUNCTION bins% (b$)
 
DIM SHARED sbin AS STRING * 60
DIM SHARED sbins AS STRING * 60
 
Globale strings dimensioneres med plads til maskinkoden.
bin-koden fylder 49 bytes
bins-koden fylder 53 bytes
Init

Maskinkoden indlæses

b$ = "10011101"
PRINT b$; " = "; bins(b$)

10011101 = 157
b% = 157
PRINT b%; " = "; bin$(b%)

157 = 10011101
Subrutiner og funktioner
SUB Init
  BLOAD "bin.bin", VARPTR(sbin)) 
  BLOAD "bins.bin", VARPTR(sbins)) 
END SUB
>MASM: bin.asm og bins.asm
 
FUNCTION bin$ (b%)
  b$ = SPACE$(16)
  CALL ABSOLUTE(b%, b$, VARPTR(sbin)
  bin$ = LTRIM$(b$)
END FUNCTION
b% : den numeriske værdi (fx 157).
b$ : til den returnerede binære tekst ("10011101").
 
FUNCTION bins% (b$)
  CALL ABSOLUTE(b$, b%, VARPTR(sbins)
  bins% = b%
END FUNCTION
b$ : den binære tekst (fx "10011101").
b% : den returnerede numeriske værdi (157).