Source/ Codesnippets | | | | p.specht
| qui dans XProfan-11 eingebaute Not()-Funktion arbeitet sur Logisch 1 (véritable) ou bien 0 (faux) hin. un Binäres NOT sollte dagegen qui bits einer Integerzahl invertieren. une mathématique Version des binären NOT pourrait folgendermaßen lauten:
Elegant ist cela mais pas justement. Ersatzweise peux cela binäre Not dans XProfan-11 mais z.B. aussi par un Xor(,) erreicht volonté. chez signed Integers kehrt cela allerdings cela Vorzeichen um.
Eventuell peux beim Effacer des n. bits (0..31) einer Integerzahl x& folgendes verwendet volonté (XProfan kennt en supplément mais aussi eigene bit-Manipulationsbefehle):
Ist qui Integerzahl justement ou bien ungerade?:
Ist bit n& (0..31) im Integerwert x& gesetzt?
Ändere ("Toggle") cela n. bit im Integerwert x&
Lösche cela jeweils rechteste 1-bit:
Isoliere cela am weitesten à droite stehende 1-bit:
Schalte alle bits à droite vom derzeit rechtesten sur 1 (ist aucun 'rechteste 1' vorhanden, schalte ALLE sur 1)
Isoliere cela am weitesten à droite stehenden 0-bit (= Zeige avec einer 1 puis):
Schalte cela rechteste 0-bit sur 1:
Ist une numéro une Zweierpotenz (= 2 hoch Integerzahl zw. 0 et 31)? (attention: 0 wird ici fälschlicherweise comme une 2-hoch numéro behandelt!)
Den rechtesten zusammenhängenden Block de 1-bits sur 0-bits mettons:
Schnelles Zählen qui 1il-bits:
source u.a.: [...] |
| | | Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 14.05.2021 ▲ |
| |
| | p.specht
| ici encore un 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 retourner ============= quelquefois verhält sich Selbstbau-Peripherie verkehrt. sur qui Gründe voudrais je ici pas plus eingehen ... qui Solution liegt dans einer schnellen Proc, qui qui bit-Reihenfolge dedans einer 4-Byte Long-Variable& umkehrt. cela Beispiel ist léger à autre Gegebenheiten (Nibble, Byte, Word, mittels Erweiterung aussi sur Quadword) anpassbar... - ou bien aussi à den change größerer Einheiten dans qui Bitfolge, z.B. qui Bytes dans einem DWord.
Windowtitle " Reverse DWord bits dans 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
Fenêtre Style 24:CLS:font 2:imprimer
Déclarer b&,v&' 32-bit doubleword to reverse bit l'ordre
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&
imprimer " %";right$(mkstr$("0",31)+suis$(v&),32)
endproc
Proc checkrev :parameters b&,v&
whileloop 0,31:ifnot testbit(b&,&Boucle)=testbit(v&,31-&Boucle)
imprimer " Bit",si(&Boucle<10," ",»);&Boucle,"not reversed!":endif
endwhile:imprimer "\n +++"
endproc
Begin:
b& = %01100100101100111010101010101111 : showbits b& : imprimer
v& = ReverseBits(b&) : showbits v&
CheckRev b&,v&
waitinput
Fin
|
| | | 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 dans XProfan, Rotate-Befehle pas. cela changement wir maintenant, zumindest quoi Rotation sans Einbeziehung eines zusätzlichen Carry-bits betrifft: qui Rotationsweite ist de 1 jusqu'à 31 einstellbar (sinnvoll jeweils seulement jusqu'à max. 15, par-dessus hinaus sollte on simple qui Rotationsrichtung changement). aussi qui Bitbreite qui Rotation ist entre 32 bit jusqu'à 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&)
tandis que 1
locate 2,2
imprimer right$(nu$+suis$(x&),w&)
sound 300,30
waitinput 1000
x&=RotL(x&,n&,w&)
Wend
RotateWide sur 2 x 32 bit ======================= XProfan-11 kannte encore aucun QuadInt, mais quelquefois peux on sich là avec deux einfachen Int behelfen. Unelegant, mais comme 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
imprimer translate$(right$(nu$+suis$(y&),w&)+»+right$(nu$+suis$(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 laisser, diesmal sur 3 DWords. Braucht garantiert aucun...
Fenêtre 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
imprimer translate$(\
right$(nu$+suis$(z&),w&)+"."+\
right$(nu$+suis$(y&),w&)+"."+\
right$(nu$+suis$(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 sur "unsigned Integers" ================================ mon Routinenvergleich hat derzeit folgende Favoriten (~31 µs/Rotation), Überdrehungs-verifiziert de -1024 jusqu'à +1024 Rotationsschritten:
|
| | | Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 30.05.2021 ▲ |
| |
| | p.specht
| qui 8 bits dans einem Byte mittig spiegeln ================================
Simpler Bit-Reverser pour 32-bit (signed or unsigned) Integers ============================================ qui nachstehende Proc velours Testprogramm spiegelt alle bits einer XProfan 32-bit Integervariable à qui Mitte. Beschleunigungsversuche a la C++ Code verliefen jusqu'à dato mais négative, là sich Shift-À gauche chez negativen Shift-Schritten - anders comme dans C - pas umkehrt. qui l'affaire ici ist ausgiebig getestet, bleibt mais toutefois sans chacun Gewähr!
|
| | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 30.05.2021 ▲ |
| |
|
Zum QuelltextOptions du sujet | 3.706 Views |
Themeninformationencet Thema hat 1 participant: |