Zu einer Zahl das optische Pendant im Hexadezimalsystem

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Zu einer Zahl das optische Pendant im Hexadezimalsystem

Beitrag von KeyKon »

Nun, wie die Überschrift schon sagt suche ich eine Möglichkeit möglichst Effizient eine Binärzahl so umzuwandeln dass ihre Hexadezimalschreibweise der Dezimalzahl gleicht.
Meine Frage ist, geht das überhaupt sonderlich effizient (auf mathematischem Weg), bin da nicht so das Genie *g*?
Gerne darf ein Beispiel auch in ASM sein.
Einsatz soll wohlgemerkt nicht vorrangig in PB sein sondern für einen Microcontroller (8-Bit), ich suche hier in erster Linie einen Denkanstoß, oder ein: Nein geht nicht.

Beispiel:

Code: Alles auswählen

%0000 1110 -> %0010 100
14         ->       $14
Beispielcode der das über den Umweg String macht:

Code: Alles auswählen

number = %0011000000111001

hexNumber = Val("$"+Str(number))

Debug Str(number)+" -> $"+Hex(hexNumber)
LG KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Zu einer Zahl das optische Pendant im Hexadezimalsystem

Beitrag von NicTheQuick »

Du meinst sowas?

Code: Alles auswählen

Procedure.i dec2hex_optical(dec.i)
	Protected result.i, mult.i = 0
	While dec
		result + (dec % 10) << mult
		dec / 10
		mult + 4
	Wend
	ProcedureReturn result
EndProcedure
Procedure.i hex2dec_optical(hex.i)
	Protected result.i, mult.i = 1
	While hex
		result + (hex & $f) * mult
		hex >> 4
		mult * 10
	Wend
	ProcedureReturn result
EndProcedure

number.i = %0011000000111001
hexNumber.i = dec2hex_optical(number)
numberRev.i = hex2dec_optical(hexNumber)
Debug Str(number) + " -> $" + Hex(hexNumber) + " -> " + Str(numberRev)
//Edit: Shift statt Multiplikation benutzt und Rücktransformation hinzugefügt.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Zu einer Zahl das optische Pendant im Hexadezimalsystem

Beitrag von KeyKon »

Genau sowas meinte ich :)
Und gute Idee mit dem Shift, da spart man sich einiges.
Darum jede Stelle einzeln abzuarbeiten kommt man also vermutlich nicht rum, oder?

LG KeyKon
(\/) (°,,,°) (\/)
Antworten