Seite 1 von 1
Maximum/Minimum(Byte)
Verfasst: 23.05.2009 18:07
von cxAlex
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 ^^)
Code: Alles auswählen
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))
Re: Maximum/Minimum(Byte)
Verfasst: 24.05.2009 08:16
von Little John
cxAlex hat geschrieben:(Hab grad mit den Shift-Operatoren rumgespielt ^^)
Das geht einfacher ohne Shift-Operatoren in For-Schleifen.
Code: Alles auswählen
EnableExplicit
Procedure.q MinValue (bytes, signed=#True)
Protected ret.q
If signed
ret = -Pow(2, bytes*8-1)
Else
ret = 0
EndIf
ProcedureReturn ret
EndProcedure
Procedure.q MaxValue (bytes, signed=#True)
Protected ret.q
If signed
ret = Pow(2, bytes*8-1)
Else
ret = Pow(2, bytes*8)
EndIf
ProcedureReturn ret - 1
EndProcedure
;-- Demo
Debug MinValue(SizeOf(Byte))
Debug MaxValue(SizeOf(Byte))
Debug MinValue(SizeOf(Byte), #False)
Debug MaxValue(SizeOf(Byte), #False)
Debug "------------------"
Debug MinValue(SizeOf(Word))
Debug MaxValue(SizeOf(Word))
Debug MinValue(SizeOf(Word), #False)
Debug MaxValue(SizeOf(Word), #False)
Debug "------------------"
Debug MinValue(SizeOf(Long))
Debug MaxValue(SizeOf(Long))
Debug MinValue(SizeOf(Long), #False)
Debug MaxValue(SizeOf(Long), #False)
Debug "------------------"
Debug MinValue(SizeOf(Quad))
Debug MaxValue(SizeOf(Quad))
Debug MinValue(SizeOf(Quad), #False)
Debug MaxValue(SizeOf(Quad), #False)
Gruß, Little John
Verfasst: 24.05.2009 08:55
von cxAlex
Aber meine Methode ist sicher schneller

.
(in dem Fall komplett sinnlos ^^)
Verfasst: 24.05.2009 09:14
von Little John
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.
Sorry, aber das hier ist einfach kein sinnvoller Tip oder Trick für Shift-Operationen.
Gruß, Little John
Verfasst: 24.05.2009 09:22
von cxAlex
Das das ganze eigentlich keinen Sinn hat hab ich aber schon in meinem 1. Post geschrieben....
Verfasst: 24.05.2009 09:40
von DarkDragon
Little John hat geschrieben: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.

Verfasst: 24.05.2009 11:00
von Little John
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
in meinem obigen Code
durch
ersetzen.
Gruß, Little John
Verfasst: 24.05.2009 12:01
von DarkDragon
Little John hat geschrieben: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.
Verfasst: 24.05.2009 12:36
von Little John
Das kann z.B. so eingesetzt werden:
Code: Alles auswählen
Procedure Power2 (exponent)
! xor eax, eax
! mov ecx, [p.v_exponent]
! bts eax, ecx
ProcedureReturn
EndProcedure
;-- Demo
For i = 0 To 10
Debug Power2(i)
Next
Gruß, Little John