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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
dag
Beiträge: 12
Registriert: 16.06.2009 15:01

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

Beitrag 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
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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))
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten