; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3588&start=10 ; Author: Topsoft (updated for PB 4.00 by Andre) ; Date: 02. January 2004 ; OS: Windows ; Demo: No Structure LongLongs lowlow.w lowhi.w LongLongs.w hihi.w EndStructure Structure LongLongs2 low.l hi.l EndStructure Procedure.s LL_Hex(*Value1.LongLongs); hex(value1) a$=RSet(Hex(*Value1\hihi&$ffff),4,"0")+RSet(Hex(*Value1\LongLongs&$ffff),4,"0")+RSet(Hex(*Value1\lowhi&$ffff),4,"0")+RSet(Hex(*Value1\lowlow&$ffff),4,"0") While Left(a$,1)="0" a$=Mid(a$,2,Len(a$)-1) Wend If a$ ProcedureReturn a$ Else ProcedureReturn "0" EndIf EndProcedure Procedure.s LL_Bin(*Value1.LongLongs); bin(value1) a$=RSet(Bin(*Value1\hihi&$ffff),16,"0")+RSet(Bin(*Value1\LongLongs&$ffff),16,"0")+RSet(Bin(*Value1\lowhi&$ffff),16,"0")+RSet(Bin(*Value1\lowlow&$ffff),16,"0") While Left(a$,1)="0" a$=Mid(a$,2,Len(a$)-1) Wend If a$ ProcedureReturn a$ Else ProcedureReturn "0" EndIf EndProcedure Procedure LL_ShiftRight(*Value1.LongLongs,divx) ; Value1=Value1>>divx LongLongs=*Value1\LongLongs&$ffff hihi=*Value1\hihi&$ffff lowlow=*Value1\lowlow&$ffff lowhi=*Value1\lowhi&$ffff While divx>0 If divx>16: divx-16:div=16 : Else : div=divx:divx=0 : EndIf mask=(1<>div)+((lowhi&mask)<>div)+((LongLongs&mask)<>div)+((hihi&mask)<>div) Wend *Value1\LongLongs=LongLongs *Value1\lowlow=lowlow *Value1\hihi=hihi *Value1\lowhi=lowhi ProcedureReturn *Value1 EndProcedure Procedure LL_ShiftLeft(*Value1.LongLongs,mulx) ; Value1=Value1<0 If mul>16: mulx-16:mul=16 : Else : mul=mulx:mulx=0 : EndIf lowlow=(lowlow<>16&$ffff) :lowlow&$ffff LongLongs =(LongLongs <>16&$ffff) :lowhi&$ffff hihi =((hihi <>16&$ffff))&$ffff :LongLongs&$ffff Wend *Value1\LongLongs=LongLongs *Value1\lowlow=lowlow *Value1\hihi=hihi *Value1\lowhi=lowhi ProcedureReturn *Value1 EndProcedure Procedure LL_Add(*Value1.LongLongs,*Value2.LongLongs) ; Value1+Value2 LongLongs1=*Value1\LongLongs&$ffff hihi1=*Value1\hihi&$ffff lowlow1=*Value1\lowlow&$ffff lowhi1=*Value1\lowhi&$ffff LongLongs2=*Value2\LongLongs&$ffff hihi2=*Value2\hihi&$ffff lowlow2=*Value2\lowlow&$ffff lowhi2=*Value2\lowhi&$ffff lowlow=lowlow1+lowlow2 lowhi=(lowhi1+lowhi2)+((lowlow>>16)&$ffff):lowlow&$FFFF LongLongs=(LongLongs1+LongLongs2)+((lowhi>>16)&$FFFF):lowhi&$ffff hihi=((hihi1+hihi2)+((LongLongs>>16)&$FFFF))&$FFFF:LongLongs&$FFFF *Value1\LongLongs=LongLongs *Value1\lowlow=lowlow *Value1\hihi=hihi *Value1\lowhi=lowhi ProcedureReturn *Value1 EndProcedure Procedure LL_Sub(*Value1.LongLongs,*Value2.LongLongs) ; Value1-Value2 LongLongs1=*Value1\LongLongs&$ffff hihi1=*Value1\hihi&$ffff lowlow1=*Value1\lowlow&$ffff lowhi1=*Value1\lowhi&$ffff LongLongs2=(~*Value2\LongLongs)&$ffff hihi2=(~*Value2\hihi)&$ffff lowlow2=(~*Value2\lowlow)&$ffff lowhi2=(~*Value2\lowhi)&$ffff lowlow=lowlow1+lowlow2+1 lowhi=(lowhi1+lowhi2)+((lowlow>>16)&$ffff):lowlow&$FFFF LongLongs=(LongLongs1+LongLongs2)+((lowhi>>16)&$FFFF):lowhi&$ffff hihi=((hihi1+hihi2)+((LongLongs>>16)&$FFFF))&$FFFF:LongLongs&$FFFF *Value1\LongLongs=LongLongs *Value1\lowlow=lowlow *Value1\hihi=hihi *Value1\lowhi=lowhi ProcedureReturn *Value1 EndProcedure Procedure LL_Bit(*Value1.LongLongs2,bit) ; Test if bit set If bit>=32 x=1<<(bit-32) ProcedureReturn (*Value1\hi&x) Else x=1<hihi2 Result=-1 ElseIf hihi1LongLongs2 Result=-1 ElseIf LongLongs1lowhi2 Result=-1 ElseIf lowhi1lowlow2 Result=-1 ElseIf lowlow1