Warum schiebe ich nun die Zahl 1 um 16^3 nach links?
Weil die Zahl 1 als BCD die Stellen/Positions-Wertigkeit 16^3 hat.
Aber warum multipliziere ich das jetzt?
Weil viele Wege nach Rom führen

und weil "
a * 16 + b * 256" verständlicher und einfacher/schneller getippt ist als "
SHL(a, 4) + SHL(b, 8 )" (und Compilerfreundlich alle Operanden in der Formel vom Datentyp INT sind)
In FUP sind beide Wege gleich aufwendig einzugeben:
Code:
+-----+ +-----+
| MUL | | SHL |
a--| |--- = a--| |---
| | | |
16--| | 4--| |
+-----+ +-----+
Bei BCD sind immer 4 Bits (eine Tetrade) eine Ziffer - wie bei Hexadezimalzahlen, mit dem Unterschied daß nur die Ziffern 0 bis 9 zulässig sind. Wegen der 4 Bits ist die Positions-Wertigkeit einer Ziffer eine 16-er Potenz, entsprechend der Position wo die Ziffer steht.
Eine Dezimalzahl (Basis 10) der Form abcd hat den Wert:
a * 10^3 + b * 10^2 + c * 10^1 + d * 10^0
Eine BCD-Zahl (Basis 16) der Form BCD#abcd = 16#abcd hat den Wert:
a * 16^3 + b * 16^2 + c * 16^1 + d * 16^0
Bei allen Zahlenformaten/Zahlensystemen entspricht die Verschiebung um eine Ziffernstelle nach Links einer Multiplikation mit der Basis des Zahlensystems. Eine Verschiebung um eine Ziffernstelle nach Rechts entspricht einer Division mit der Basis des Zahlensystems.
Bei Binärzahlen entspricht die Verschiebung um 1 Stelle (1 Bit) nach Links der Multiplikation mit 2 (dez), um 2 Stellen nach Links der Multiplikation mit 4 (dez) ... um 4 Stellen nach Links der Multiplikation mit 16 (dez) usw.
Bei BCD- und Hexadezimalzahlen entspricht die Verschiebung um 1 Ziffernstelle (1 Tetrade) nach Links einer Multiplikation mit 16 = 16^1, um 2 Ziffernstellen nach Links einer Multiplikation mit 16 * 16 = 16^2 = 256, um 3 Ziffernstellen nach Links einer Multiplikation mit 16 * 16 * 16 = 16^3 = 4096 usw.
Eine Umwandlung einer Dezimalzahl in eine BCD-Zahl ist nicht nur eine Änderung der Ansicht des Wertes in einem anderen Zahlensystem (wie z.B. 1234 = 16#04D2) sondern die Dezimalziffern werden in jeweils 4 Bits untergebracht/neu gruppiert, wodurch sich 1234 ---> BCD#1234 = 16#1234 (= 4660 dezimal) ergibt.
Und wie wäre es , wenn ich dann eine Zahl hätte, die BCD-codiert ein DWORD ergeben würde. Also 32 BIT. das wären ja dann 8 Tetraden. Hätte ich dann das BIT um 32^7 verschieben müssen???
Wenn Du eine Dezimalzahl der Form 12345678 hast, dann mußt Du die 1 mit 16^7 multiplizieren oder um 7 * 4 = 28 Bit nach Links schieben.
12345678 ---> BCD#12345678 = 16#12345678:
1 * 16^7 + 2 * 16^6 + 3 * 16^5 + 4 * 16^4 + 5 * 16^3 + 6 * 16^2 + 7 * 16^1 + 8 * 16^0
Harald