Aller Anfang zwei Bilder
Hinweis: Umrechnungen wie z.B. Basis 2 zu Basis 16.
Wie man auf dem Bild erkennen kann, können die entsprechenden Werte schon im ersten Schritt, in der ersten Zeile abgeleitet werden. Das erhöht die Performance für die Berechnung um ein vielfaches.
Der Algorithmus
Die binäre Zahl 10101010010100110111010 soll in eine Zahl mit Basis 10 umgerechnet werden.
Damit eine solche Berechnung gemacht werden kann, benötigt der Algorithmus dazu 2 Schritte und zwei verschiedene Formeln. Beide Schritte werden in der Schleife immer und immer wieder abgearbeitet, bis die Zahlenreihe des zweiten Schrittes durchgehend 0 ist.
Der erste Schritt liefert pro Position ein Zwischenergebnis, der parallel für den zweiten Schritt benötigt wird.
Der letzte Wert der Zahlenreihe ist die gesuchte Zahl der neuen Basis. Der Anfangswert dieser Zahlenreihe ist bei jedem Durchgang immer 0. Der erste Schritt kann im Programm als Zwischenschritt angeschaut werden.
Der zweite Schritt liefert alle Zahlen die als Grundlage wieder für diese zwei Schritte verwendet wird.
Zwei Formeln (Manuelles Verfahren)
Manuell gerechnet, wird nur eine Variable r benötigt. Als Programm sind jedoch zwei Variablen nötig r, rT. Nach jedem Durchgang der ganzen Zahlenreihe (von links nach rechts), wird r wieder auf 0 gesetzt. Genauso auch im Programm.
Um es verständlicher zu machen, habe ich die Formeln zwei mal hingeschrieben. Einmal speziell für die 1. Position und einmal für die anderen Postionen der Zahlenreihe. Ab der 2. Position wird im manuellen Verfahren das Ergebnis des ersten Schritten an r übergeben. Der Wert von r hinkt also immer um eine Position hinterher. Die Variable BIT ist jener Wert der Zahlenreihenposition mit der als Grundlage gerechnet wird. (Nach jedem Durchgang der Schleife immer der zweite Schritt).
rT = 0; r = 0; Die Anfangswerte für die erste Position der Zahlenreihe ist 0.
Ab der zweiten Position der ersten und zweiten Zahlenreihe
Der Code
Die Klasse NSC - Numeral System Converter enthält den Algorithmus für die Umrechnung der Zahlensysteme. Sie konvertiert natürliche Zahlen (exkl. 0) gesplittet in einer Integer-Array von einer Basis ins Andere. Für negative Zahlen habe ich das Programm noch nicht getestet.
Der Funktionsaufruf des Konverters benötigt 3 Variable. Die Integer-Array
Alle Einstiegswerte werden zuerst geprüft, wobei CheckEmptyLess0() eine Funktion ist, die prüft, ob die Array
Die Schleife mit der Umsetzung der oben erwähnten zwei Schritte.
Und zu guter Letzt die Mainfunktion
BuchstabenSubstitutionen
NSC - Numeral System Converter ist ein rein numerisches Lösungsverfahren. Sie kann jedoch problemlos erweitert werden. Z.B. mit einer Funktion für die Umwandlung der Integer-Array zu Hex-Werten als String. Das könnte man in etwa so bewerkstelligen.
Auf die anderen Klassen und Funktionen möchte ich hier nicht eingehen. Sie sind im TestProjekt ausführlich kommentiert.
Zusammenfassung
NSC - Numeral System Converter ist ein Algorithmus, der Natürliche Zahlen im Integerbereich numerisch von einer Basis in eine andere Basis umrechnet. Die Umsetzung erfolgt in zwei Schritten mit sehr einfachen Formeln. NSC hat eine sehr gute Performance, und ist für Zahlenwerte mit mehreren 1000 Zifferstellen konzipiert, und kann quasi beliebig erweitert werden. Zahlenbasen von über 1Mio können problemlos berechnet werden.
Viel Spass mit dem Programm.
Freundliche Grüsse
exc-jdbi
Hinweis: Umrechnungen wie z.B. Basis 2 zu Basis 16.
Wie man auf dem Bild erkennen kann, können die entsprechenden Werte schon im ersten Schritt, in der ersten Zeile abgeleitet werden. Das erhöht die Performance für die Berechnung um ein vielfaches.
Der Algorithmus
Die binäre Zahl 10101010010100110111010 soll in eine Zahl mit Basis 10 umgerechnet werden.
Damit eine solche Berechnung gemacht werden kann, benötigt der Algorithmus dazu 2 Schritte und zwei verschiedene Formeln. Beide Schritte werden in der Schleife immer und immer wieder abgearbeitet, bis die Zahlenreihe des zweiten Schrittes durchgehend 0 ist.
Der erste Schritt liefert pro Position ein Zwischenergebnis, der parallel für den zweiten Schritt benötigt wird.
Der letzte Wert der Zahlenreihe ist die gesuchte Zahl der neuen Basis. Der Anfangswert dieser Zahlenreihe ist bei jedem Durchgang immer 0. Der erste Schritt kann im Programm als Zwischenschritt angeschaut werden.
Der zweite Schritt liefert alle Zahlen die als Grundlage wieder für diese zwei Schritte verwendet wird.
Zwei Formeln (Manuelles Verfahren)
Manuell gerechnet, wird nur eine Variable r benötigt. Als Programm sind jedoch zwei Variablen nötig r, rT. Nach jedem Durchgang der ganzen Zahlenreihe (von links nach rechts), wird r wieder auf 0 gesetzt. Genauso auch im Programm.
Um es verständlicher zu machen, habe ich die Formeln zwei mal hingeschrieben. Einmal speziell für die 1. Position und einmal für die anderen Postionen der Zahlenreihe. Ab der 2. Position wird im manuellen Verfahren das Ergebnis des ersten Schritten an r übergeben. Der Wert von r hinkt also immer um eine Position hinterher. Die Variable BIT ist jener Wert der Zahlenreihenposition mit der als Grundlage gerechnet wird. (Nach jedem Durchgang der Schleife immer der zweite Schritt).
rT = 0; r = 0; Die Anfangswerte für die erste Position der Zahlenreihe ist 0.
Ab der zweiten Position der ersten und zweiten Zahlenreihe
Der Code
Die Klasse NSC - Numeral System Converter enthält den Algorithmus für die Umrechnung der Zahlensysteme. Sie konvertiert natürliche Zahlen (exkl. 0) gesplittet in einer Integer-Array von einer Basis ins Andere. Für negative Zahlen habe ich das Programm noch nicht getestet.
Der Funktionsaufruf des Konverters benötigt 3 Variable. Die Integer-Array
input
als Abbild jener Zahl die umgerechnet werden soll, die Startbasis = 2
und die Zielbasis = 10
wie im Beispiel oben.Alle Einstiegswerte werden zuerst geprüft, wobei CheckEmptyLess0() eine Funktion ist, die prüft, ob die Array
input
nur aus Nullen besteht oder negative Zahlen enthält.Die Schleife mit der Umsetzung der oben erwähnten zwei Schritte.
VB.NET-Quellcode
- 'Die For-Schleife iteriert durch die ganze Integer-Array.
- 'Zwei Schritte werden gemacht:
- 'Erster Schritt: rT berechnen nach der entsprechenden Formel (Zwischenschritt)
- 'Zweiter Schritt: den neuen Wert ausrechnen nach entsprechender Formel
- 'rT wird an r übergeben, damit das Zwischenergebnis immer um i-1 zurückhinkt, sobald die
- 'For-Schleife wieder von vorne anfängt.
- 'Zum Schluss eine kleine Prüfung, ob der neue Wert in ipt(i) grösser 0 ist.
- '>>> Sollte durchgehen 0 vorhanden sein wird 'ext' nie auf false umgeschaltet und somit
- '>>> wird die while-Schleife am Schluss verlassen.
- 'In der Whileschleife werden r (auf 0) und ext (zu True) immer wieder zurückgesetzt
- '- Der errechnete Endwert wird in der ListOfT festgehalten
- '- ext wird geprüft ob True. Wenn Wahr/True wird die Schleife verlassen
- While (True)
- r = 0 : ext = True
- For i As Integer = 0 To ipt.Length - 1
- rT = ((startBase * r) + ipt(i)) Mod targetBase
- ipt(i) = ((startBase * r) + ipt(i)) \ targetBase
- r = rT
- If ipt(i) > 0 Then ext = False
- Next
- lst.Insert(0, r)
- If ext Then Exit While
- End While
Und zu guter Letzt die Mainfunktion
VB.NET-Quellcode
- Public Sub Main()
- 'Instanzieren der benötigten Klassen
- 'NSC ist der Numeral System Converter
- 'Random1000 ist eine Klasse um den Anfangswert in der gewünschten Startbasis zu erhalten
- 'Stopwatch ist eine .Net-Klasse und wird benötigt, um die Zeit zu messen.
- Dim n As New NSC
- Dim r As New Random1000
- Dim sw As New Stopwatch
- 'Start- und Zielbasis bekannt geben
- Dim startBase As Integer = 10
- Dim targetBase As Integer = 5
- 'Zufälliger Anfangswert (Array) anfordern
- Dim iNum() As Integer = r.NewRnd1000(startBase)
- 'Prüfen ob erhaltener Anfangswert gültig ist.
- If iNum IsNot Nothing Then
- 'Zeitmessung einleiten.
- sw.Start()
- 'Berechnung durchführen
- Dim res() As Integer = n.convert(iNum, startBase, targetBase)
- 'Zeitmessung stoppen
- sw.Stop()
- 'Prüfen ob der erhalte Zielwert gültig ist.
- If res IsNot Nothing Then
- 'Aus dem Anfangswert einen String machen.
- Dim sNum As String = MakeStringNum(iNum, False)
- 'Aus dem Zielwert einen String machen.
- Dim sRes As String = MakeStringNum(res, False)
- 'Auf der Konsole ausgeben.
- PrintOut(sNum, sRes, startBase, targetBase, iNum.Length, res.Length, sw)
- End If
- End If
- 'Konsole anzeigen
- Console.ReadKey()
- End Sub
BuchstabenSubstitutionen
NSC - Numeral System Converter ist ein rein numerisches Lösungsverfahren. Sie kann jedoch problemlos erweitert werden. Z.B. mit einer Funktion für die Umwandlung der Integer-Array zu Hex-Werten als String. Das könnte man in etwa so bewerkstelligen.
VB.NET-Quellcode
- Private literals As String = "0123456789ABCDEF"
- Private Function HexLiteralSubstitution(ByVal iArrB16() As Integer) As String
- If iArrB16.Length > 0 Then
- Dim sb As New StringBuilder(iArrB16.Length)
- For Each i As Integer In iArrB16
- sb.Append(literals(i))
- Next
- Return sb.ToString
- End If
- Return String.Empty
- End Function
Auf die anderen Klassen und Funktionen möchte ich hier nicht eingehen. Sie sind im TestProjekt ausführlich kommentiert.
Zusammenfassung
NSC - Numeral System Converter ist ein Algorithmus, der Natürliche Zahlen im Integerbereich numerisch von einer Basis in eine andere Basis umrechnet. Die Umsetzung erfolgt in zwei Schritten mit sehr einfachen Formeln. NSC hat eine sehr gute Performance, und ist für Zahlenwerte mit mehreren 1000 Zifferstellen konzipiert, und kann quasi beliebig erweitert werden. Zahlenbasen von über 1Mio können problemlos berechnet werden.
Viel Spass mit dem Programm.
Freundliche Grüsse
exc-jdbi
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „exc-jdbi“ ()