| Quelltexte/ Codesnippets |  |  |  |  |  |  |  |  p.specht
 
 
  | | Die in XProfan-11 eingebaute Not()-Funktion arbeitet auf Logisch 1 (Wahr) oder 0 (falsch) hin. Ein Binäres NOT sollte dagegen die bits einer Integerzahl invertieren. Eine mathematische Version des binären NOT könnte folgendermaßen lauten: 
 Elegant ist das aber nicht gerade. Ersatzweise kann das binäre Not in XProfan-11 aber z.B. auch durch ein Xor(,) erreicht werden. Bei signed Integers kehrt das allerdings das Vorzeichen um.
 
 Eventuell kann beim Löschen des n. bits (0..31) einer Integerzahl x& folgendes verwendet werden (XProfan kennt  dazu aber auch eigene bit-Manipulationsbefehle):
 
 Ist die Integerzahl gerade oder ungerade?:
 
 Ist bit n& (0..31) im Integerwert x& gesetzt?
 
 Ändere ("Toggle") das n. bit im Integerwert x&
 
 Lösche das jeweils rechteste 1-bit:
 
 Isoliere das am weitesten rechts stehende 1-bit:
 
 Schalte alle bits rechts vom derzeit rechtesten auf 1 (ist keine 'rechteste 1' vorhanden, schalte ALLE auf 1)
 
 Isoliere das am weitesten rechts stehenden 0-bit (= Zeige mit einer 1 darauf):
 
 Schalte das rechteste 0-bit auf 1:
 
 Ist eine Zahl eine Zweierpotenz (= 2 hoch Integerzahl zw. 0 und 31)?
 (Vorsicht: 0 wird hier fälschlicherweise als eine 2-hoch Zahl behandelt!)
 
 n&=2^30:print n&,"ist ";if((n& & (-n&))=n&,if(n&,"eine","keine"),"keine");" Zweierpotenz!":waitinput
Den rechtesten zusammenhängenden Block von 1-bits auf 0-bits setzen:
 
 Schnelles Zählen der 1er-bits:
 
 Quelle u.a.:  [...]
  | 
 |  |  |  |  | | Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 14.05.2021  ▲ | 
 |  |  |  | 
 
 
 |  |  |  |  p.specht
 
 
  | | Hier noch ein kleiner Trick zum Austausch ganzer Bit-Gruppen: 
 | 
 |  |  |  |  | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 22.05.2021  ▲ | 
 |  |  |  | 
 
 
 |  |  |  |  p.specht
 
 
  | | Bits umdrehen =============
 Manchmal verhält sich Selbstbau-Peripherie verkehrt. Auf die Gründe möchte ich hier nicht weiter eingehen
  ... Die Lösung liegt in einer schnellen Proc, die die bit-Reihenfolge innerhalb einer 4-Byte Long-Variable& umkehrt. Das Beispiel ist leicht an andere Gegebenheiten (Nibble, Byte, Word, mittels Erweiterung auch auf Quadword) anpassbar... - oder auch an den Tausch größerer Einheiten in der Bitfolge, z.B. der Bytes in einem DWord. 
 Windowtitle "  Reverse DWord bits in 5 Lines of Code"
'Q: https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel
'Transscript CPP to XProfan-11.2a, 2018-03 by P.Specht, Vienna/Austria
WindowStyle 24:CLS:font 2:print
Declare b&,v&' 32-bit doubleword to reverse bit order
Proc ReverseBits :parameters v&
    v& = ((v& >> 1) & $55555555) | ((v& & $55555555) << 1)
    v& = ((v& >> 2) & $33333333) | ((v& & $33333333) << 2)
    v& = ((v& >> 4) & $0F0F0F0F) | ((v& & $0F0F0F0F) << 4)
    v& = ((v& >> 8) & $00FF00FF) | ((v& & $00FF00FF) << 8)
    v& = ( v& >> 16            ) | ( v&             << 16)
    return v&
endproc
Proc showBits :parameters v&
    print " %";right$(mkstr$("0",31)+bin$(v&),32)
endproc
Proc checkrev :parameters b&,v&
    whileloop 0,31:ifnot testbit(b&,&Loop)=testbit(v&,31-&Loop)
        print " Bit",if(&Loop<10," ","");&Loop,"not reversed!":endif
        endwhile:print "\n +++"
    endproc
    Begin:
    b& = %01100100101100111010101010101111 : showbits b& : print
    v& = ReverseBits(b&)   : showbits v&
    CheckRev b&,v&
    waitinput
    End
 | 
 |  |  |  |  | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 26.05.2021  ▲ | 
 |  |  |  | 
 
 
 |  |  |  |  p.specht
 
 
  | | RotateLeft, RotateRight =====================
 Shiftbefehle existieren in XProfan, Rotate-Befehle nicht. Das ändern wir jetzt, zumindest was Rotation ohne Einbeziehung eines zusätzlichen Carry-bits betrifft: Die Rotationsweite ist von 1 bis 31 einstellbar (sinnvoll jeweils nur bis max. 15, darüber hinaus sollte man einfach die Rotationsrichtung ändern). Auch die Bitbreite der Rotation ist zwischen 32 bit bis 2 bit herunter einstellbar.
 
 cls:font 2
var x&=%00100111
var n&= 1'[1..31]
var w&=32'[2..32]
var nu$="00"
proc RotL :parameters x&,n&,w&
    return (x&<<n&) | (x&>>(w&-n&))
endproc
proc RotR :parameters x&,n&,w&
    return (x&>>n&) | (x&<<(w&-n&))
endproc
nu$=mkstr$("0",w&)
while 1
    locate 2,2
    print right$(nu$+bin$(x&),w&)
    sound 300,30
    waitinput 1000
    x&=RotL(x&,n&,w&)
wend
RotateWide über 2 x 32 bit
 =======================
 XProfan-11 kannte noch keine QuadInt, aber manchmal kann man sich da mit zwei  einfachen Int behelfen. Unelegant, aber als Demo muss es reichen:
 
 cls:font 2
declare x&,y&,a&,b&,c&,d&,w&,n&,nu$
w&=32'2..32
nu$=mkstr$("0",w&)
n&=1
x&=%10101001100011100001111
repeat
    locate 2,2
    print translate$(right$(nu$+bin$(y&),w&)+":"+right$(nu$+bin$(x&),w&),"0","°")
    waitinput 400
    ROTLw
until 0
Proc ROTRw
    a&=x&>>n&
    b&=x&<<(w&-n&)
    c&=y&>>n&
    d&=y&<<(w&-n&)
    x& = a& | d&
    y& = b& | c&
endproc
Proc ROTLw
    a&=x&<<n&
    b&=x&>>(w&-n&)
    c&=y&<<n&
    d&=y&>>(w&-n&)
    x& = a& | d&
    y& = b& | c&
endproc
Nochmal rotieren lassen, diesmal über 3 DWords. Braucht garantiert keiner...
 
 Window 0,0-%maxx,100
font 2
declare x&,y&,z&,a&,b&,c&,d&,e&,f&,w&,n&,nu$
w&=32'2..32
nu$=mkstr$("0",w&)
n&=1
x&=%10101001100011100001111
repeat
    locate 2,2
    print translate$(\
    right$(nu$+bin$(z&),w&)+"."+\
    right$(nu$+bin$(y&),w&)+"."+\
    right$(nu$+bin$(x&),w&)\
    ,"0","°")
    waitinput 20
    ROTLw
until 0
Proc ROTRw
    a&=x&>>n&
    b&=x&<<(w&-n&)
    c&=y&>>n&
    d&=y&<<(w&-n&)
    e&=z&>>n&
    f&=z&<<(w&-n&)
    x& = a& | d&
    y& = c& | f&
    z& = e& | b&
endproc
Proc ROTLw
    a&=x&<<n&
    b&=x&>>(w&-n&)
    c&=y&<<n&
    d&=y&>>(w&-n&)
    e&=z&<<n&
    f&=z&>>(w&-n&)
    x& = a& | f&
    y& = c& | b&
    z& = e& | d&
endproc
 | 
 |  |  |  |  | | Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 27.05.2021  ▲ | 
 |  |  |  | 
 
 
 |  |  |  |  p.specht
 
 
  | | ROR32 / ROL32 auf "unsigned Integers" ================================
 Mein Routinenvergleich hat derzeit folgende Favoriten (~31 µs/Rotation),
 Überdrehungs-verifiziert von -1024 bis +1024 Rotationsschritten:
 
 | 
 |  |  |  |  | | Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 30.05.2021  ▲ | 
 |  |  |  | 
 
 
 |  |  |  |  p.specht
 
 
  | | Die 8 bits in einem Byte mittig spiegeln ================================
 
 Simpler Bit-Reverser für 32-bit (signed or unsigned) Integers
 ============================================
 Die nachstehende Proc samt Testprogramm spiegelt alle bits einer XProfan 32-bit Integervariable an der Mitte. Beschleunigungsversuche a la C++ Code verliefen bis dato aber negativ, da sich Shift-Left bei negativen Shift-Schritten - anders als in C - nicht umkehrt. Die Sache hier ist ausgiebig getestet, bleibt aber dennoch ohne jede Gewähr!
 
 | 
 |  |  |  |  | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 30.05.2021  ▲ | 
 |  |  |  | 
 
 
 | 
 Zum Quelltext| Themenoptionen | 4.533 Betrachtungen | 
 ThemeninformationenDieses Thema hat 1 Teilnehmer: |