Es funktioniert aber ich vermute das es schneller geht bzw. bessere Methoden gibt.
Ist mein Code so ok oder geht es besser?
Das ganze soll nämlich bei der Bildbearbeitung eingesetzt werden daher sollte es so flott wie möglich sein
Code:
Code: Alles auswählen
;PB v.5.62 x64 (Win 7 / 10)
Procedure.i SetBit(*Target,Bit.i)
!mov rax,[rsp + 30h]
!mov rcx,[rsp + 38h]
!bts [rax],rcx
EndProcedure
Procedure.i GetBit(*Target,Bit.i)
!xor rax,rax
!mov rcx,[rsp + 30h]
!mov rdx,[rsp + 38h]
!bt [rcx],rdx
!setc al
ProcedureReturn
EndProcedure
Procedure.i SetBits(*Target,Offset.i,Value.i)
Select Value
Case 1;001
SetBit(*Target,Offset + 2)
Case 2;010
SetBit(*Target,Offset + 1)
Case 3;011
SetBit(*Target,Offset + 1)
SetBit(*Target,Offset + 2)
Case 4;100
SetBit(*Target,Offset)
Case 5;101
SetBit(*Target,Offset)
SetBit(*Target,Offset + 2)
Case 6;110
SetBit(*Target,Offset)
SetBit(*Target,Offset + 1)
Case 7;111
SetBit(*Target,Offset + 0)
SetBit(*Target,Offset + 1)
SetBit(*Target,Offset + 2)
EndSelect
EndProcedure
Procedure.i GetBits(*Target.Long,Offset.i)
Protected Dim Bit.a(3)
Bit(0) = GetBit(*Target,Offset)
Bit(1) = GetBit(*Target,Offset + 1)
Bit(2) = GetBit(*Target,Offset + 2)
*Target = @Bit()
Select *Target\l
Case 65536
ProcedureReturn 1
Case 256
ProcedureReturn 2
Case 65792
ProcedureReturn 3
Case 1
ProcedureReturn 4
Case 65537
ProcedureReturn 5
Case 257
ProcedureReturn 6
Case 65793
ProcedureReturn 7
EndSelect
EndProcedure
Global Buffer.i
SetBits(@Buffer,0,4);<- setze den Wert 4 (in 3 Bits) an die Position @Buffer + Offset (in Bits)
Debug GetBits(@Buffer,0);<- hier wird der Wert wieder ausgelesen