Converting Dec to Bin, Oct, Hex and vice versa

Share your advanced PureBasic knowledge/code with the community.
BackupUser
PureBasic Guru
PureBasic Guru
Posts: 16777133
Joined: Tue Apr 22, 2003 7:42 pm

Post by BackupUser »

Restored from previous forum. Originally posted by fweil.

It's a bit long but may it help some of us ...

I tested as much as possible to have good performances and bugless results.

I suppose it exist a better solution using assembly but I do not have so much time to find ...

;**************************************
Dim Dec2BaseDigit.s(16)

Dec2BaseDigit(0) = "0"
Dec2BaseDigit(1) = "1"
Dec2BaseDigit(2) = "2"
Dec2BaseDigit(3) = "3"
Dec2BaseDigit(4) = "4"
Dec2BaseDigit(5) = "5"
Dec2BaseDigit(6) = "6"
Dec2BaseDigit(7) = "7"
Dec2BaseDigit(8) = "8"
Dec2BaseDigit(9) = "9"
Dec2BaseDigit(10) = "A"
Dec2BaseDigit(11) = "B"
Dec2BaseDigit(12) = "C"
Dec2BaseDigit(13) = "D"
Dec2BaseDigit(14) = "E"
Dec2BaseDigit(15) = "F"

Global Dec2BaseDigit

Procedure.s Dec2Base(n.l, Base.l)
RB.l
Out.s = ""
Select Base
Case 16
Out = Hex(n)
Default
Result.l = n
Res.l = 0
While Result > 0
RB = Result / Base
Res = Base * RB
Out = Dec2BaseDigit(Result - Res) + Out
Result = RB
Wend
If Out = ""
Out = "0"
EndIf
EndSelect
ProcedureReturn Out
EndProcedure

Procedure.s Dec2Hex(n.l)
Res.l
R16.l
Result.l = n
Out.s = ""
While Result > 0
R16 = Result >> 4
Res = R16 0
R8 = Result >> 3
Res = R8 0
R2 = Result >> 1
Res = 2 * R2
Out = Dec2BaseDigit(Result - Res) + Out
Result = R2
Wend
If Out = ""
Out = "0"
EndIf
ProcedureReturn Out
EndProcedure

Procedure Bin2Dec(n.s)
Result.l
For i = 1 To Len(n)
Result = 2 * Result + Val(Mid(n, i, 1))
Next
ProcedureReturn Result
EndProcedure

Procedure Oct2Dec(n.s)
Result.l
For i = 1 To Len(n)
Result = 8 * Result + Val(Mid(n, i, 1))
Next
ProcedureReturn Result
EndProcedure

Procedure Hex2Dec(n.s)
Result.l
Digit.l
For i = 1 To Len(n)
Select Mid(n, i, 1)
Case "A"
Digit = 10
Case "B"
Digit = 11
Case "C"
Digit = 12
Case "D"
Digit = 13
Case "E"
Digit = 14
Case "F"
Digit = 15
Default
Digit = Val(Mid(n, i, 1))
EndSelect
Result = 16 * Result + Digit
Next
ProcedureReturn Result
EndProcedure

;
; Main starts here for testing
;

DecConst.l
BinConst.s
OctConst.s
HexConst.s

OpenConsole()

DecConst = 16434824
BinConst = "111110101100011010001000"
OctConst = "76543210"
HexConst = "FAC688"

PrintN("Dec2Base(n,2) : Dec2Base(" + Str(DecConst) + ",2) =" + Dec2Base(DecConst, 2))
PrintN("Dec2Bin(n) : Dec2Bin(" + Str(DecConst) + ") =" + Dec2Bin(DecConst))
PrintN("Dec2Base(n,8) : Dec2Base(" + Str(DecConst) + ",8) =" + Dec2Base(DecConst, 8))
PrintN("Dec2Oct(n) : Dec2Oct(" + Str(DecConst) + ") =" + Dec2Oct(DecConst))
PrintN("Dec2Base(n,16) : Dec2Base(" + Str(DecConst) + ",16)=" + Dec2Base(DecConst, 16))
PrintN("Dec2Hex(n) : Dec2Hex(" + Str(DecConst) + ") =" + Dec2Hex(DecConst))
PrintN("Hex(n) : Hex(" + Str(DecConst) + ") =" + Hex(DecConst))
PrintN("Bin2Dec(n) : Bin2Dec(" + BinConst + ") =" + Str(Bin2Dec(BinConst)))
PrintN("Oct2Dec(n) : Oct2Dec(" + OctConst + ") =" + Str(Oct2Dec(OctConst)))
PrintN("Hex2Dec(n) : Hex2Dec(" + HexConst + ") =" + Str(Hex2Dec(HexConst)))

;
; and for fun ...
;

PrintN(Str(Hex2Dec(Dec2Hex(123456789))))
PrintN(Str(Oct2Dec(Dec2Oct(123456789))))
PrintN(Str(Bin2Dec(Dec2Bin(123456789))))

While Inkey() = ""
Wend

CloseConsole()

End
;**************************************

Francois Weil
14, rue Douer
F64100 Bayonne
BackupUser
PureBasic Guru
PureBasic Guru
Posts: 16777133
Joined: Tue Apr 22, 2003 7:42 pm

Post by BackupUser »

Restored from previous forum. Originally posted by Danilo.

Thanks fweil !!

cya,
...Danilo

(registered PureBasic user)
Post Reply