Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1088to1092
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Mehr Mathe als VBA gefragt!!

Mehr Mathe als VBA gefragt!!
Nico
Hallo und vorweg mein Dank an die schlauen Leute die mir Helfen wollen.
Momentan steh ich auf dem Schlauch!
Ich habe eine Route gefunden, welche ich umwandeln möchte, doch lässt mich mein Hirn im Stich.
Diese Routine wandelt 5 Zahlen welche zwischen 1-255 liegen dürfen in 8 Zahlen um welche zwischen 1-32 liegen. Bei Bedarf kann man diese 8 Zahlen wieder in die 5 Original-Zahlen zurückwandeln.
Ich such nun nach einer Möglichkeit diese Routine so anzupassen, das die 8 neu erzeugten Zahlen nur Werte zwischen 1-10 haben dürfen.
Hier das Script:

Sub rechne()
Dim bytB1 As Byte, bytB2 As Byte, bytB3 As Byte, bytB4 As Byte, bytB5 As Byte
Dim bytZ1 As Byte, bytZ2 As Byte, bytZ3 As Byte, bytZ4 As Byte
Dim bytZ5 As Byte, bytZ6 As Byte, bytZ7 As Byte, bytZ8 As Byte
Dim z1 As Byte, z2 As Byte, z3 As Byte, z4 As Byte, z5 As Byte, z6 As Byte, z7 As Byte, z8 As   _
_
Byte
Dim erg1 As Byte, erg2 As Byte, erg3 As Byte, erg4 As Byte, erg5 As Byte
bytB1 = 62
bytB2 = 48
bytB3 = 15
bytB4 = 32
bytB5 = 12
Debug.Print "Startwerte 32bit"
Debug.Print "**********"
Debug.Print bytB1
Debug.Print bytB2
Debug.Print bytB3
Debug.Print bytB4
Debug.Print bytB5
Debug.Print ""
'Pseudowerte 32bit (maximaler Wert bytZx=32)
bytZ1 = ((bytB1 And 248) \ 8) + 1
bytZ2 = (((bytB2 And 192) \ 64) Or ((bytB1 And 7) * 4)) + 1
bytZ3 = ((bytB2 And 62) \ 2) + 1
bytZ4 = (((bytB3 And 240) \ 16) Or ((bytB2 And 1) * 16)) + 1
bytZ5 = (((bytB4 And 128) \ 128) Or ((bytB3 And 15) * 2)) + 1
bytZ6 = ((bytB4 And 124) \ 4) + 1
bytZ7 = (((bytB5 And 224) \ 32) Or ((bytB4 And 3) * 8)) + 1
bytZ8 = (bytB5 And 31) + 1
Debug.Print "Pseudowerte 32bit"
Debug.Print "**********"
Debug.Print bytZ1
Debug.Print bytZ2
Debug.Print bytZ3
Debug.Print bytZ4
Debug.Print bytZ5
Debug.Print bytZ6
Debug.Print bytZ7
Debug.Print bytZ8
Debug.Print ""
'Entschlüsselung 32bit
erg1 = (bytZ1 - 1) * 8 + (bytZ2 - 1) \ 4
erg2 = ((bytZ2 - 1) Mod 4) * 64 + (bytZ3 - 1) * 2 + (bytZ4 - 1) \ 16
erg3 = ((bytZ4 - 1) Mod 16) * 16 + (bytZ5 - 1) \ 2
erg4 = ((bytZ5 - 1) Mod 2) * 128 + (bytZ6 - 1) * 4 + (bytZ7 - 1) \ 8
erg5 = ((bytZ7 - 1) Mod 8) * 32 + (bytZ8 - 1)
Debug.Print "Antwortwerte 32bit"
Debug.Print "************"
Debug.Print erg1
Debug.Print erg2
Debug.Print erg3
Debug.Print erg4
Debug.Print erg5
Debug.Print "_________________________________________________"
Debug.Print ""
End Sub

Danke noch mal das das kleine Mathegenie, welches helfen möchte.

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Mehr Mathe als VBA gefragt!!
14.07.2009 22:44:44
Ramses
Hallo
ich denke das wird mit der routine nicht gehen, da 10 kein logischer Wert in diesem System ist.
Wozu brauchst du das ?
Gruss Rainer
AW: Mehr Mathe als VBA gefragt!!
14.07.2009 22:58:00
JogyB
Hi.
Geht meiner Ansicht nach nicht. Das wandelt 5 Werte mit 8 bit (zusammen 40 bit) in 8 Werte mit 5 bit (zusammen wieder 40 bit). Bildraum und Urbildraum sind also gleich groß. Mit Werten von 1-10 ist der Bildraum kleiner als der Urbildraum, es gibt also keine bijektive Abbildung von Urbildraum zu Bildraum und damit keine Umkehrfunktion.
Gruss, Jogy
AW: Mehr Mathe als VBA gefragt!!
14.07.2009 23:06:48
Nico
Hmmm dann grüble ich wahrscheinlich die ganze Zeit in die Falsche Richtung.
Wenn ich Euch aber richtig verstehe, dann sollte es umwandelbar sein, solange es Potenzen von 8 sind. Quasi 8, 16, 32, 64, 128, 256 etc.
Wenn dann die 5 Ziffern im Wert von 1-255 zu 8 Ziffern vom Wert 1-8 werden sollen und diese später wieder umwandelbar sein soll, wie muss ich da die Routine Anpassen?
Anzeige
AW: Mehr Mathe als VBA gefragt!!
15.07.2009 09:42:26
Jogy
Hi.
Nein, das hast Du falsch verstanden. Die Gesamtlänge muss gleich bleiben. Eine bijektive Abbildung eines 40 bit Raumes in einen 40 bit Raum geht. Bei 8 Werten von 1-8 würdest Du es aber in einen 24 bit Raum abbilden und das würde bedeuten, dass verschiedene Ausgangswerte zu den gleichen Endwerten führen - damit ist die Rückfunktion nicht mehr eindeutig. Du könntest 10 Zahlen von 1-16 nehmen oder 20 Zahlen von 1-4, dann wären die Größen der beiden Mengen gleich.
Was auch noch ginge, wäre den Bildraum größer zu wählen, also 14 Werte von 1-8. Dann könnte man die Funktion zumindest injektiv gestalten, was die Rücktransformation von durch die Transformation erhaltenen Werten erlauben würde (anders ausgedrückt: Du kannst zwar nicht jede beliebige Kombination von 14 Zahlen von 1-8 in 5 Zahlen von 1-256 umwandeln, wenn Du jedoch 5 Zahlen von 1-256 in 14 Zahlen von 1-8 umwandelst, dann kannst Du die auch wieder zurückverwandeln).
Wie die Funktion dann aussehen muss... puh, da müßte ich mir das mal genauer anschauen. Was recht einfach gehen würde, wäre das jetzige Ergebnis in eine Binärzahl umzusetzen und dann anders aufzuteilen. Da wäre dann zwar ein eigentlich unnötiger Zwischenschritt dabei, im Gegensatz zum Basteln einer völlig neuen Funktion geht das aber problemlos.
Gruss, Jogy
Anzeige
keine Ahnung wie das Prinzip funktioniert
14.07.2009 23:06:45
NoNet
Hallo Nico,
ich verstehe weder, WAS Du mit dem Code erreichen möchtest, noch WAS der Code genau macht - obwohl mir die einzelnen Operatoren (AND und \ und MOD) natürlich geläufig sind...
Hier zumindest mal eine "Verkürzung" des Codes :
Option Base 1
Sub rechne()
Dim bytB(), bytZ(1 To 8) As Byte
Dim z(1 To 5) As Byte, erg(1 To 8) As Byte
Dim intT As Integer
'SendKeys "^g^a{del}" 'Sollte eigentlich den Direktbereich VOR der Ausführung des Makros lö _
schen !
bytB = Array(62, 48, 15, 32, 12)
Debug.Print "Startwerte 32bit"
Debug.Print "**********"
For intT = 1 To 5: Debug.Print bytB(intT): Next
Debug.Print ""
'Pseudowerte 32bit (maximaler Wert bytZx=32)
bytZ(1) = ((bytB(1) And 248) \ 8) + 1
bytZ(2) = (((bytB(2) And 192) \ 64) Or ((bytB(1) And 7) * 4)) + 1
bytZ(3) = ((bytB(2) And 62) \ 2) + 1
bytZ(4) = (((bytB(3) And 240) \ 16) Or ((bytB(2) And 1) * 16)) + 1
bytZ(5) = (((bytB(4) And 128) \ 128) Or ((bytB(3) And 15) * 2)) + 1
bytZ(6) = ((bytB(4) And 124) \ 4) + 1
bytZ(7) = (((bytB(5) And 224) \ 32) Or ((bytB(4) And 3) * 8)) + 1
bytZ(8) = (bytB(5) And 31) + 1
Debug.Print "Pseudowerte 32bit"
Debug.Print "**********"
For intT = 1 To 8: Debug.Print bytZ(intT): Next
Debug.Print ""
'Entschlüsselung 32bit
erg(1) = (bytZ(1) - 1) * 8 + (bytZ(2) - 1) \ 4
erg(2) = ((bytZ(2) - 1) Mod 4) * 64 + (bytZ(3) - 1) * 2 + (bytZ(4) - 1) \ 16
erg(3) = ((bytZ(4) - 1) Mod 16) * 16 + (bytZ(5) - 1) \ 2
erg(4) = ((bytZ(5) - 1) Mod 2) * 128 + (bytZ(6) - 1) * 4 + (bytZ(7) - 1) \ 8
erg(5) = ((bytZ(7) - 1) Mod 8) * 32 + (bytZ(8) - 1)
Debug.Print "Antwortwerte 32bit"
Debug.Print "************"
For intT = 1 To 5: Debug.Print erg(intT): Next
Debug.Print "_________________________________________________"
Debug.Print ""
End Sub
Gruß, NoNet
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige