Re: SetBits / GetBits gut genug?
Verfasst: 25.10.2018 22:34
Punkt 7 ist einfach, aber hier absolut fehl am Platz, genauso wie GPU. Die Dateioperationen sind sowieso zig mal langsamer.
Code: Alles auswählen
Case 4;100
SetBit(*Target,Offset)Code: Alles auswählen
;PB v.5.62 x64 (Win 7 / 10)
Procedure setbit(*target.integer,bit.i)
*target\i | (1<<bit)
ProcedureReturn *target\i
EndProcedure
Procedure GetBit(*target.integer,bit.i)
ProcedureReturn ( *target\i >> bit) & 1
EndProcedure
Procedure.i SetBits(*Target.integer,Offset.i,Value.i)
*target\i & ~(%111 << offset) | (value << offset)
ProcedureReturn *Target\i
EndProcedure
Procedure.i GetBits(*Target.integer,Offset.i)
ProcedureReturn (*target\i >> offset) & %111
EndProcedure
Global Buffer.i
setbit(@buffer,8)
SetBits(@buffer,2,7)
SetBits(@Buffer,2,4);<- setze den Wert 4 (in 3 Bits) an die Position @Buffer + Offset (in Bits)
Debug GetBits(@Buffer,2);<- hier wird der Wert wieder ausgelesen
Debug Bin(buffer)
For i=0 To 8
Debug GetBit(@buffer,i)
Next
Code: Alles auswählen
; Fastbits
EnumerationBinary Bits
#bit0
#bit1
#bit2
#bit3
#bit4
#bit5
#bit6
#bit7
#bit8
#bit9
#bit10
#bit11
#bit12
#bit13
#bit14
#bit15
#bit16
#bit17
#bit18
#bit19
#bit20
#bit21
#bit22
#bit23
#bit24
#bit25
#bit26
#bit27
#bit28
#bit29
#bit30
#bit31
#bit32
#bit33
#bit34
#bit35
#bit36
#bit37
#bit38
#bit39
#bit40
#bit41
#bit42
#bit43
#bit44
#bit45
#bit46
#bit47
#bit48
#bit49
#bit50
#bit51
#bit52
#bit53
#bit54
#bit55
#bit56
#bit57
#bit58
#bit59
#bit60
#bit61
#bit62
#bit63
EndEnumeration
; -------------------------------------------------------------------
Macro Bit(no)
(1 << no)
EndMacro
; -------------------------------------------------------------------
Macro SetBit(Value, bits)
Value | Bits
EndMacro
; -------------------------------------------------------------------
Macro ClrBit(Value, bits)
Value & ~Bits
EndMacro
; -------------------------------------------------------------------
Macro GetBit(Value, bits)
(Value & Bits)
EndMacro
; -------------------------------------------------------------------
Macro IsBit(Value, bits)
Bool(Value & Bits)
EndMacro
; -------------------------------------------------------------------
;-Test
var1.i = 1
Setbit(var1, #bit1)
Debug var1
ClrBit(var1, #bit0)
SetBit(var1, bit(3))
SetBit(var1, #bit63)
Debug "Bin : " + Bin(var1)
Debug GetBit(var1, 7)
Debug "IsBit 0 = " + IsBit(var1, #bit0)
Debug "IsBit 1 = " + IsBit(var1, #bit1)
var2.i = 0
SetBit(var2, 7)
ClrBit(var2, %0001)
Debug "var2 = " + var2
; SetBit(var2, 7)
MOV r15,qword [v_var2]
OR r15,7
MOV qword [v_var2],r15
; ClrBit(var2, %0001)
MOV r15,qword [v_var2]
AND r15,-2
MOV qword [v_var2],r15
GPI hat geschrieben:Code: Alles auswählen
Procedure.i SetBits(*Target.integer,Offset.i,Value.i) *target\i & ~(%111 << offset) | (value << offset) ProcedureReturn *Target\i EndProcedure Procedure.i GetBits(*Target.integer,Offset.i) ProcedureReturn (*target\i >> offset) & %111 EndProcedure
Binär '100' ist 4 lt. -> https://de.wikipedia.org/wiki/NibbleGPI hat geschrieben:Äh, ich hab eine Frageist doch falsch. Man zählt, wie bei allen Zahlen, von rechts nach links, entsprechend ist es offset+2.Code: Alles auswählen
Case 4;100 SetBit(*Target,Offset)
Mijikai hat geschrieben:Wie würde der Code von GPI (SetBits / GetBits) als Macro aussehen?
Code: Alles auswählen
Macro SetBits(_variable_, _offset_, _value_)
_variable_ & ~(%111 << _offset_) | (_value_ << _offset_)
EndMacro
Macro GetBits(_variable_, _offset_)
((_variable_ >> _offset_) & %111)
EndMacroCode: Alles auswählen
Define.i settings
SetBits(settings, 2, 1)Code: Alles auswählen
Define.i settings
settings & ~(%111 << 2) | (1 << 2)Bin mir nicht sicher ob ich das mit dem Kontext verstanden habe.Sicro hat geschrieben:Mijikai hat geschrieben:Wie würde der Code von GPI (SetBits / GetBits) als Macro aussehen?Code: Alles auswählen
Macro SetBits(_variable_, _offset_, _value_) _variable_ & ~(%111 << _offset_) | (_value_ << _offset_) EndMacro Macro GetBits(_variable_, _offset_) ((_variable_ >> _offset_) & %111) EndMacro