Seite 1 von 1

Mini Functions: Min,Max,BitSet,BitClr,BitTst,BitChg

Verfasst: 15.08.2016 11:35
von dag
Kleine Helfer, die Bitoperationen ohne Assembler nachbilden.

Code: Alles auswählen

; Diese Funktionen, aus dem GFA-Basic bekannt, fehlten einfach. Darum Nachgebildet.
; ------------
Procedure Max(Wert1,Wert2)                   ; Grösseren Wert feststellen
If Wert1 > Wert2 : ProcedureReturn Wert1 : Else : ProcedureReturn Wert2 :EndIf
EndProcedure
Procedure Min(Wert1,Wert2)                   ; Kleineren Wert feststellen
If Wert1 > Wert2 : ProcedureReturn Wert2 : Else : ProcedureReturn Wert1 :EndIf
EndProcedure
Procedure BitSet(A,N)     ; Setzt N bit
  If N<1 : N=1 : EndIf
  ProcedureReturn A | %0001 << (N-1)
EndProcedure
Procedure BitClr(A,N)     ; Clears N bit
  If N<1 : N=1 : EndIf
  ProcedureReturn BitSet(A,N) ! BitSet(0,N)
EndProcedure
Procedure BitTst(A,N)     ; Returns N bit gesetzt?
  If A & BitClr(A,N)=A : ProcedureReturn #False :  EndIf
  ProcedureReturn #True
EndProcedure
Procedure BitChg(A,N)     ; Ändert das N bit ins Gegenteil 
  If A & BitClr(A,N)=A : ProcedureReturn BitSet(A,N) : EndIf    ; falsch: - A|1<<N - bitset benutzen
  ProcedureReturn BitSet(A,N) ! BitSet(0,N)
EndProcedure
; ------------ 1103

Re: Mini Functions: Min,Max,BitSet,BitClr,BitTst,BitChg

Verfasst: 15.08.2016 19:30
von STARGÅTE
Hallo dag,

etwas merkwürdig deine Funktionen.
  • Du benutzt eine 1-basierende Zählweise der Bits, normalerweise wird eine 0-basierende Zählweise genutzt.
  • Dein BitClr() kannst du genauso wie BitSet() ohne zusätzliche Funktionsaufrufe lösen mit dem Not (~):
    A & ~(%0001 << (N-1))
  • Dein BitTst() kann auch ohne weiteren Funktionsaufruf verändert werden:
    If A & (%0001 << (N-1)) : ProcedureReturn #True : EndIf
  • BitChg() ist ebenfalls sehr verkompliziert, schließlich ist ein Ändern des Bits nichts anderes als ein XOr (!) mit 1:
    A ! (%0001 << (N-1))