PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Von dezimal zu dual Umrechnung



Killer
15.12.2007, 22:56
Hallo,
Bin gerade dabei mir 2 kleine Programme zu schreiben, einmal für die Umrechnung von dual->dezimal und einmal von dezimal->dual.
Ersteres klappt prima nur dezimal-> dual läuft nicht. Möchte ich jetzt zum Beispiel die Zahl 255 in 8 Dualzahlen zerlegen (was ja eigendlich 11111111 also 8x1 ergeben müsste), kommt der Simulator aber auf 11111110!!!!! Woran kann das liegen??? Ich hoffe der Code ist einigermaßen verständlich :-b


Dim Dual1 As Bit
Dim Dual2 As Bit
Dim Dual3 As Bit
Dim Dual4 As Bit
Dim Dual5 As Bit
Dim Dual6 As Bit
Dim Dual7 As Bit
Dim Dual8 As Bit

Dim Dezi1 As Byte
Dim Dezi2 as byte
Dim Dezi3 as byte
Dim Dezi4 as byte
Dim Dezi5 as byte
Dim Dezi6 as byte
Dim Dezi7 as byte
Dim Dezi8 As Byte

Dim Dezidualtimer As Byte
Dezidualtimer = 0

Dezi1 = 255






Dezimal_dual:
Dezidualtimer = Dezidualtimer + 1
Dezi2 = Dezi1 / 2 '127
Dezi3 = Dezi2 + Dezi2 '254
Dezi4 = Dezi3 + 1 '255
Select Case Dezidualtimer
Case 1 : Goto Dezimal_dual_1
Case 2 : Goto Dezimal_dual_2
Case 3 : Goto Dezimal_dual_3
Case 4 : Goto Dezimal_dual_4
Case 5 : Goto Dezimal_dual_5
Case 6 : Goto Dezimal_dual_6
Case 7 : Goto Dezimal_dual_7
Case 8 : Goto Dezimal_dual_8
End Select
Dezimal_dual_1:
If Dezi4 = Dezi1 Then
Dual8 = 1
Else
Dual8 = 0
End If
Goto Dezimal_dual_schleife
Dezimal_dual_2:
If Dezi4 = Dezi1 Then
Dual7 = 1
Else
Dual7 = 0
End If
Goto Dezimal_dual_schleife
Dezimal_dual_3:
If Dezi4 = Dezi1 Then
Dual6 = 1
Else
Dual6 = 0
End If
Goto Dezimal_dual_schleife
Dezimal_dual_4:
If Dezi4 = Dezi1 Then
Dual5 = 1
Else
Dual5 = 0
End If
Goto Dezimal_dual_schleife
Dezimal_dual_5:
If Dezi4 = Dezi1 Then
Dual4 = 1
Else
Dual4 = 0
End If
Goto Dezimal_dual_schleife
Dezimal_dual_6:
If Dezi4 = Dezi1 Then
Dual3 = 1
Else
Dual3 = 0
End If
Goto Dezimal_dual_schleife
Dezimal_dual_7:
If Dezi4 = Dezi1 Then
Dual2 = 1
Else
Dual3 = 0
End If
Goto Dezimal_dual_schleife
Dezimal_dual_8:
If Dezi4 = Dezi1 Then
Dual1 = 1
Else
Dual1 = 0
End If
Goto Dezimal_dual_schleife

Dezimal_dual_schleife:
Dezi1 = Dezi2
If Dezidualtimer > 8 Then
'Ende und Funktion
Print Dual1 ; Dual2 ; Dual3 ; Dual4 ; Dual5 ; Dual6 ; Dual7 ; Dual8
Wait 300
End If
Goto Dezimal_dual


MfG Killer

Excalibur
16.12.2007, 00:53
Mir wäre da so zu umständlich

Habe jetzt zwar kein Bascom zur Hand, aber folgender QuickBasic-code sollte sich einfach anpassen lassen.


DIM erg AS STRING
DIM a AS INTEGER, b AS INTEGER, c AS INTEGER, d AS INTEGER, e AS INTEGER
erg = ""
a = 0'zahl die konvertiert wird
b = 256 'bei 8 bit umwandlung (2 hoch 8)+1=256
e = a 'Arbeitsvariable, a bleibt erhalten fr ausgabe
DO
c = b / 2
'c hat bei 8 bit nacheinander die werte 128,64,32,16,8,4,2,1
d = e \ c'Modulare Division
IF d >= 1 THEN
erg = erg + "1"'erzeuge ausgabe fr bitposition
e = e - c 'reduziere arbeitsvariable um den der position entsprechenden wert
ELSE
erg = erg + "0"
END IF
b = c'setze neuen anfangswert fr b
LOOP UNTIL b = 1
PRINT "dezimal " + STR$(a) + " entspricht dual " + erg

Sauerbruch
17.12.2007, 20:46
Du kannst aber doch ganz einfach alle 8 Bits Deines Bytes einzeln als Byte.0 bis Byte.7 ansprechen bzw. abfragen.

Wenn ich die Variable "Zahl" in ihre 8 Bits zerlegen müsste, würde ich das vielleicht so machen:




Dim Zahl as Byte

Dim Dual0 as Bit
Dim Dual1 as Bit
Dim Dual2 as Bit
Dim Dual3 as Bit
Dim Dual4 as Bit
Dim Dual5 as Bit
Dim Dual6 as Bit
Dim Dual7 as Bit

Do

Zahl = ... (0-255)

Dual0 = Zahl.0
Dual1 = Zahl.1
Dual2 = Zahl.2
...
Dual7 = Zahl.7

Print Dual0,;Dual1; Dual2;...; Dual7

Loop





Man könnte natürlich versucht sein, Dual(N) als Array anzulegen und eine Schleife mit einem Zähler N von 1-8 durchlaufen zu lassen. Arrays gehen aber leider mit Bit-Variablen nicht...

Killer
17.12.2007, 20:55
Gut danke. Ich denke das ist die einfachste Lösung!

MfG Killer