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 QuelltextThemenoptionen | 3.687 Betrachtungen |
ThemeninformationenDieses Thema hat 1 Teilnehmer: |