Zahl umwandeln von Basis 4 zu Basis 10

paul88

Neues Mitglied
14. Feb. 2011
9
0
0
Sprachen
Guten Abend,
ich möchte mit Bascom eine Zahl (z.B. 3130) zur Basis 4 umwandeln ins Dezimalsystem (= 220).

Mit der folgenden Funktion klappt das auch; sie erscheint mir aber sehr umständlich. Vielleicht gibt es einen besseren, einfacheren Weg.

Code:
Function B4_to_bin(z1 As Byte , Z2 As Byte) As Byte
Dim B As Byte , T As Byte
Dim St1 As String * 1 , St2 As String * 1 , St3 As String * 1 , St4 As String * 1
   S = Str(z1) + Str(z2)
   St1 = Mid(s , 4 , 1)
   St2 = Mid(s , 3 , 1)
   St3 = Mid(s , 2 , 1)
   St4 = Mid(s , 1 , 1)
   B = Val(st4) * 64
   T = B
   B = Val(st3) * 16
   T = T + B
   B = Val(st2) * 4
   T = T + B
   B = Val(st1) * 1
   T = T + B
   B4_to_bin = T
End Function

Danke für Eure Hilfe.

Paul
 
Hallo Paul,
das sieht so aus als ob die Zahl im 4er System in den beiden Bytes Z1 und Z2 daherkommt. Heißt das, das es so ist:

Code:
       Z1                Z2
       31                30
00[B]11[/B]_00[B]01[/B]   00[B]11[/B]_00[B]00[/B]
    11      01       11      00
         
             11011100        = 220
Eigentlich brauchst du dann nur die fett geschriebenen Bits in ein Byte zusammenzufassen.

HBA
 
Hallo HinterBlauenAugen,
ja, schon recht. Aber wie mache ich das konkret?
Paul88
 
Hallo Paul!

Ich kann da ja mal einen Ansatz zu liefern...

Die Zahl 31 (dezimal) ist binär zwar:
binär= 1_1111

aber wenn du sie in den BCD-Code wandelst, dann wird daraus:
BCD= 0011_0001 ;)
Das "ergibt" dann deine 31


In BASCOM kannst du mit Makebcd(var) eine dezimale Zahl (bzw. binären Wert) in den BCD-Code umwandeln.


Genauso kannst du mit dem zweiten Byte (Z2) verfahren.....


Anschließend baust du die einzelnen Bits zu einem Byte zusammen und kannst dir die dezimale Zahl ausgeben lassen. ;)


Öhm.... mal nebenbei....
Wofür benötigt man das eigentlich? :hmmmm:

Grüße,
Cassio
 
Ich würde auch mal fragen, wo die Werte wie 3130 herkommen. Evtl. kannst du gleich bei der Erstellung dafür sorgen, dass sie nicht in zwei Byte sondern direkt in einem abgespeichert werden. Dann kannst du dir die komplette Konvertierung sparen.

HBA
 
Hallo,

versucht doch mal den folgenden Code-Schnipsel den ich mal eben schnell
zurechtgestrickt habe ...


CodeBox bascom

' alle variablen als Byte

Vierer_hi = &B0011_0001 ' 31
Vierer_lo = &B0011_0000 ' 30

Binaer = Vierer_lo And &B0000_0011 ' untersten 2 Bits ausmaskieren und der Zielvariablen zuweisen

' 0011_0000 => 0000_1100 durch 2mal schieben nach rechts
' mit AND die beiden interessanten Bits vom Restmuell trennen
' mit OR zum Ergebnis der letzten Aktion hinzufuegen
Shift Vierer_lo , Right , 2 ' naechsten beiden Bits auf die Position 2+3 bringen
Temp = Vierer_lo And &B0000_1100 ' Ausmaskieren und speichern
Binaer = Binaer Or Temp ' die Bits in die Zielvariable einfuegen

' hier als erstes die beiden obersten Bits bearbeiten weil die
' sonst beim schieben nach links herausfallen würden
Shift Vierer_hi , Left , 2
Temp = Vierer_hi And &B1100_0000
Binaer = Binaer Or Temp

' Bits 0+1 sind durch die letzte Aktion auf Position 2+3 gewandert.
' werden aber an Position 4+5 benoetigt.
Shift Vierer_hi , Left , 2
Temp = Vierer_hi And &B0011_0000
Binaer = Binaer Or Temp

' jetzt sollte theoretisch in "Binaer" das Ergebnis stehen ;-)

sollte hoffentlich funktionieren ...

Ist ein wenig Bitpopelei die man beim Assemblerprogrammieren lernt :cool:
Für 10 Minuten tippen ist wohl was halbwegs brauchbares rausgekommen ...

Binär nach Dezimal sollte dann wohl kein Problem sein ... :D

Gruß
Dino
 
Hallo Leute,

danke für Eure Bemühungen.

Aber sie helfen mir leider nicht wirklich weiter. Es ist alles nicht das, was ich brauche.

Nämlich: Es geht um das FS20-Haussteuerungssystem von ELV. Ich habe die Ansteuerung soweit fertig, dass sie funktioniert, wenn ich sie (durch die gepostete Routine jage).

Jetzt ist es aber so, dass da z.B. ein "Hauscode" einzugeben ist, sagen wir mal "42411234" (Zahlenbasis 1...4).

Als ersten Schritt ist die Übertragung ins Zahlensystem zur Basis 4 nötig: Es wird je 1 je Zahl abgezogen, also aus 4241 wird 3130(mein Beispiel).

Dann (schaut Euch bitte die angehängte Grafik an; konnte anders keine vernünftige Formatierung zu Stande bringen).:

Der Hex-Code "DC" oder der Dezimalcode "220" müssen dann gesendet werden. Wenn ich die Werte direkt sende (ohne Berechnung)
gehts einwandfrei.

Macht euch bitte nicht zu viele Gedanken; ich wollte nur wissen, ob mein geposteter Code "eleganter" gestaltet werden könnte. Sonst verwende ich ihn weiter so.
 

Anhänge

  • Zwischenablage01.jpg
    Zwischenablage01.jpg
    14 KB · Aufrufe: 15

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)