Wenn ich das richtig sehe ist die Methode von Make ziemlich ähnlich.
Habe diese mal so umgebaut, dass keine Stringoperationen mehr vorkommen (nur noch Arrays), das Redim rausgenommen, die Ubounds und Pointer vereinfacht usw. Im Endeffekt gab das aber kaum einen Tempovorteil zur Stringversion. Allerdings lässt sich die Arrayversion nahezu 1 zu 1 in ASM übersetzen.
Skript
Global $sDec
Global $iTimer, $iTime
Global $iCnt = 1000
Global $sHex
For $i = 1 To $iCnt Step 1
$sDec = _RandomDec(30)
$iTimer = TimerInit()
DecToBin($sDec) ; Einfach mal ohne Return. Ist ja nur zum Test
$iTime += TimerDiff($iTimer)
ToolTip($i & @CRLF)
;~ ConsoleWrite($sDec & ' -> ' & $sHex & @CRLF)
Next
ToolTip('')
ConsoleWrite('Time: ' & Round(1000*$iTime/$iCnt,0) & ' µs' & @CRLF)
Func _RandomDec($iLen)
Local $sRet = ''
For $i = 1 To $iLen Step 1
$sRet &= Random(0, 9, 1)
Next
Return $sRet
EndFunc
Func DecToBin($sNumber)
Local $aiBit[Ceiling(StringLen($sNumber)*0.41524101186092)], $product, $aDec = StringSplit($sNumber, ''), $u = 0
For $i = 1 To $aDec[0]
$carry = $aDec[$i]
For $n = 0 To $u
$product = $aiBit[$n] * 10 + $carry
$aiBit[$n] = BitAND($product, 255)
$carry = BitAND($product, 65280) / 256
Next
If $carry Then
$u += 1
$aiBit[$u] = $carry
EndIf
Next
If UBound($aiBit) > $u Then ReDim $aiBit[$u + 1]
Return StringReverse(StringFromASCIIArray($aiBit, 0, -1, 1))
EndFunc
Die Komplexität ist leider Quadratisch (schätze ich jedenfalls. ggf auch n*logn, das kann ich mit Wolfram Alpha nicht richtig fitten...
[Blockierte Grafik: http://i.imgur.com/AkSe3vc.png]
lg
M