Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Code zu berechnen wie viele ganzzahlige Werte man in n - Bytes stopfen kann, für signed und unsigned. Lustig wenn jemand schon immer mal wissen wollte was er maximal in eine 3/5/6/7 - Byte Variable stopfen könnte, sonst eher sinnlos (Hab grad mit den Shift-Operatoren rumgespielt ^^)
Macro Bool(Arg)
((Arg) Or #Null)
EndMacro
Procedure.q MaximumValue(Bytes, Signed = #True)
Protected Val.q, Bits, i
Bits = Bytes*8-(1 + 1*Bool(Signed))
For i = 0 To Bits
Val + (1<<i)
Next
ProcedureReturn Val
EndProcedure
Procedure.q MinimumValue(Bytes)
Protected Val.q, Bits, i
Bits = Bytes*8-2
For i = 0 To Bits
Val + (1<<i)
Next
If Val
Val + 1
EndIf
ProcedureReturn Val*-1
EndProcedure
Debug MaximumValue(SizeOf(Byte))
Debug MaximumValue(SizeOf(Long))
Debug MaximumValue(SizeOf(Quad))
Debug MinimumValue(SizeOf(Byte))
Debug MinimumValue(SizeOf(Long))
Debug MinimumValue(SizeOf(Quad))
cxAlex hat geschrieben:Aber meine Methode ist sicher schneller . (in dem Fall komplett sinnlos ^^)
a) Sicher ist das keineswegs, das wäre erst noch zu beweisen.
b) Wenn's wirklich schnell gehen soll, schreibt man das am besten in ASM. Dabei lässt sich
einfach durch eine entspr. Bit-Operation ersetzen.
Left Shift ist eine dieser Bit-Operationen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
DarkDragon hat geschrieben:Left Shift ist eine dieser Bit-Operationen.
Ich hatte an BTS ("bit set") gedacht. Aber Du hast natürlich Recht, Left Shift geht auch.
Ich würde es dann allerdings nicht in einer Schleife verwenden.
Und auch in normalem PB-Code ohne ASM wird hierfür keine Schleife mit Shift-Operationen benötigt.
Wem Pow() zu langsam ist, der kann mit
DarkDragon hat geschrieben:Left Shift ist eine dieser Bit-Operationen.
Ich hatte an BTS ("bit set") gedacht. Aber Du hast natürlich Recht, Left Shift geht auch.
Hmm ich dachte immer, dass es sowas auf X86 und X64 nicht gibt, weil ich hier schon desöfteren vor Jahren gelesen hab, dass es keine Bitadressierung gibt auf diesen Architekturen. Anscheinend gibts die ja doch. Ich kenne das vom 8051 aber da hieß es SETB.
Klar, Schleifen sind blöd wegen dem Prefetching.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.