Español
Fuente/ Codesnippets

Bit-hacks en XProfan

 

p.specht

El en XProfan-11 eingebaute Not()-Función arbeitet en Logisch 1 (Wahr) oder 0 (falso) hin. Ein Binäres NOT debería dagegen el bits uno Integerzahl invertieren. Un matemático Versión des binären NOT podría folgendermaßen lauten:
var x&=251:imprimir right$(mkstr$(" ",32)+bin$(x&),32)
imprimir right$(mkstr$(" ",32)+bin$(-x&-1),32):waitinput

Elegant es el pero no gerade. Ersatzweise puede binäre Not en XProfan-11 aber z.B. auch por una Xor(,) erreicht voluntad. En signed Integers kehrt el allerdings el Vorzeichen en.

Eventuell kann beim Löschen des n. bits (0..31) uno Integerzahl x& folgendes verwendet voluntad (XProfan sabe dazu aber auch propio bit-Manipulationsbefehle):
declarar y&,x&,n&:x&=555:n&=0:y&=x& & xor(1<<n&,2^32-1):imprimir y&:waitinput

Ist el Integerzahl gerade oder ungerade?:
var x&=554:imprimir x&,"ist",if(x& & 1,"ungerade","gerade"):waitinput

Ist bit n& (0..31) en el Integerwert x& gesetzt?
var n&=7:imprimir (x& &(1<<n&))>0:waitinput

Ändere ("Toggle") el n. bit en el Integerwert x&
n&=1:y& = int(XOr(y&,1<<n&)):imprimir y&
y& = int(XOr(y&,1<<n&)):imprimir y&:waitinput

Lösche el jeweils rechteste 1-bit:
y&=32^2-1
y& = y& & (y&-1) :imprimir bin$(y&)
y& = y& & (y&-1) :imprimir bin$(y&)
y& = y& & (y&-1) :imprimir bin$(y&)
y& = y& & (y&-1) :imprimir bin$(y&)
waitinput

Isoliere el al weitesten rechts stehende 1-bit:
whileloop 12:x&= rnd(2^32-1):imprimir right$(mkstr$(" ",32)+bin$(x&),32)

    x& = x& & -x& :imprimir right$(mkstr$(" ",32)+bin$(x&),32):imprimir:waitinput
    endwhile: imprimir "Ready.":waitinput

Schalte todos bits rechts vom actualmente rechtesten en 1 (es no 'rechteste 1' disponible, schalte ALLE en 1)
whileloop 12:x& = 2^rnd(31):imprimir right$(mkstr$(" ",32)+bin$(x&),32)

    x&=x& | (x&-1)
    imprimir right$(mkstr$(" ",32)+bin$(x&),32):imprimir:waitinput :endwhile :imprimir "OK" :waitinput

Isoliere el al weitesten rechts stehenden 0-bit (= Zeige con uno 1 darauf):
imprimir:whileloop 12:x& =rnd(2^32-1):imprimir right$(mkstr$(" ",32)+bin$(x&),32)
y& = Xor(x&,2^32-1) & (x&+1)
imprimir right$(mkstr$(" ",32)+bin$(y&),32):imprimir:waitinput :endwhile :imprimir "Done." :waitinput

Schalte el rechteste 0-bit en 1:
imprimir:whileloop 12:x& =rnd(2^32-1):imprimir right$(mkstr$(" ",32)+bin$(x&),32)
y& = x& | (x&+1)
imprimir right$(mkstr$(" ",32)+bin$(y&),32):imprimir:waitinput :endwhile :imprimir "Done." :waitinput

Ist una Zahl una Zweierpotenz (= 2 hoch Integerzahl zw. 0 y 31)?
(Vorsicht: 0 se hier fälschlicherweise como una 2-hoch Zahl behandelt!)
n&=2^30:imprimir n&,"ist ";if((n& & (-n&))=n&,if(n&,"eine","keine"),"keine");" Zweierpotenz!":waitinput

Den rechtesten zusammenhängenden Block de 1-bits en 0-bits conjunto:
var x&=%10001100001111000111100011110000
imprimir right$(mkstr$(" ",32)+bin$(x&),32)
x&=((x& | (x&-1))+1) & x&
imprimir right$(mkstr$(" ",32)+bin$(x&),32):waitinput

Schnelles Zählen el 1él-bits:
proc pop2 :parámetros x&

    x&=x&-((x&>>1) & $55555555)
    x&=(x& & $33333333)+((x&>>2) & $33333333)
    x&=(x&+(x&>>4)) & $0F0F0F0F
    x&=x&+(x&>>8)
    x&=x&+(x&>>16)
    volver x& & $0000003F

ENDPROC

proc pop4 :parámetros x&

    declarar n&
    n&=(x&>>1) & $77777777'Count bits en
    x&=x&-n&'each 4-bit field
    n&=(n&>>1) & $77777777
    x&=x&-n&
    n&=(n&>>1) & $77777777
    x&=x&-n&
    x&=(x&+(x&>>4)) & $0F0F0F0F'Get byte sums.
    x&= x&*$01010101'Add the bytes.
    volver x&>>24

ENDPROC

x&=%11111111111111111111111111111111
imprimir pop2(x&),"bit posición en 1"
x&=3:imprimir pop2(x&),"bit posición en 1":imprimir pop4(x&),"bits posición en 1":waitinput

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 todavía una kleiner Trick para Austausch ganzer Bit-Gruppen:
cls
var x&=111
var y&=222
imprimir "  Vorher: ";x&,y&
x& = xor(x&,y&)
y& = xor(x&,y&)
x& = xor(x&,y&)
imprimir " Nachher: ";x&,y&
waitinput
 
XProfan 11
Computer: 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 se Selbstbau-Peripherie verkehrt. Auf el Gründe möchte Yo hier no más eingehen ... El Solución liegt en uno schnellen Proc, el el bit-Reihenfolge innerhalb uno 4-Byte Largo-Variable& umkehrt. Das Ejemplo es ligeramente a otro Gegebenheiten (Nibble, Byte, Word, mittels Erweiterung auch en Quadword) anpassbar... - oder auch a el Tausch größerer Einheiten en el Bitfolge, z.B. el Bytes en un DWord.
Windowtitle "  Reverse DWord bits en 5 Lines of Code"
'Q: https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel
'Transscript CPP to XProfan-11.2a, 2018-03 by P.Pájaro carpintero, Vienna/Austria
Ventana de Estilo 24:CLS:font 2:imprimir
Declarar b&,v&' 32-bit doubleword to reverse bit order

Proc ReverseBits :parámetros 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)
    volver v&

ENDPROC

Proc showBits :parámetros v&

    imprimir " %";right$(mkstr$("0",31)+bin$(v&),32)

ENDPROC

Proc checkrev :parámetros b&,v&

    whileloop 0,31:ifnot testbit(b&,&Loop)=testbit(v&,31-&Loop)

        imprimir " Bit",if(&Loop<10," ","");&Loop,"not reversed!":endif
        endwhile:imprimir "\n +++"

    ENDPROC

    Begin:
    b& = %01100100101100111010101010101111 : showbits b& : imprimir
    v& = ReverseBits(b&)   : showbits v&
    CheckRev b&,v&
    waitinput
    End
 
XProfan 11
Computer: 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 en XProfan, Rotate-Befehle no. Das ändern wir ahora, zumindest qué Rotation sin Einbeziehung uno zusätzlichen Carry-bits betrifft: El Rotationsweite es de 1 a 31 ajustable (sinnvoll jeweils sólo a max. 15, darüber hinaus debería uno simplemente el Rotationsrichtung ändern). Auch el Bitbreite el Rotation es zwischen 32 bit a 2 bit herunter ajustable.
cls:font 2
var x&=%00100111
var n&= 1'[1..31]
var w&=32'[2..32]
var nu$="00"

proc RotL :parámetros x&,n&,w&

    volver (x&<<n&) | (x&>>(w&-n&))

ENDPROC

proc RotR :parámetros x&,n&,w&

    volver (x&>>n&) | (x&<<(w&-n&))

ENDPROC

nu$=mkstr$("0",w&)

mientras que 1

    locate 2,2
    imprimir right$(nu$+bin$(x&),w&)
    sound 300,30
    waitinput 1000
    x&=RotL(x&,n&,w&)

wend


RotateWide encima 2 x 32 bit
=======================
XProfan-11 kannte todavía no QuadInt, aber manchmal puede ser se como con zwei einfachen Int behelfen. Unelegant, aber como Demo muss lo reichen:
cls:font 2
declarar 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
    imprimir 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 dejar, diesmal encima 3 DWords. Braucht garantiert keiner...
Ventana 0,0-%maxx,100
font 2
declarar 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
    imprimir 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 en "unsigned Integers"
================================
Mein Routinenvergleich ha actualmente folgende Favoriten (~31 µs/Rotation),
Überdrehungs-verifiziert de -1024 a +1024 Rotationsschritten:
Proc RoR32 :parámetros a&,b&

    b&=b& & 31
    volver a&<<(32-b&) | a&>>b&

ENDPROC

Proc RoL32 :parámetros a&,b&

    b&=b& & 31
    volver a&<<b& | a&>>(32-b&)

ENDPROC

 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
30.05.2021  
 




p.specht

El 8 bits en un Byte mittig spiegeln
================================
var b&=%10100011
b& = b& & 255
imprimir right$("0000000"+bin$(b&),8)
b& = (((b& * $0802 & $22110) | (b& * $8020 & $88440)) * $10101 >> 16) & 255
imprimir right$("0000000"+bin$(b&),8)
waitinput

Simpler Bit-Reverser para 32-bit (signed or unsigned) Integers
============================================
El nachstehende Proc samt Testprogramm spiegelt todos bits uno XProfan 32-bit Integervariable a el Mitte. Beschleunigungsversuche a la C++ Code verliefen a dato aber negativo, como se Shift-Left en negativen Shift-Schritten - anders como en C - no umkehrt. El Sache hier es ausgiebig getestet, restos aber todavía sin jede Gewähr!
Título de la ventana "REVERSE32 para 32bit Signed y Unsigned Integervariablen"
Cls:font 2:Selección aleatoria:Declarar b&

Proc Reverse32

    parámetros v&
    declarar r&

    Whileloop 32

        r&=r&<<1
        r&=r& | (v& & 1)
        v&=v&>>1

    EndWhile

    volver r&

ENDPROC

Proc Lbin$ :parámetros x&

    volver right$("000000000000000000000000000000000"+bin$(x&),32)

ENDPROC

Proc Testprt

    imprimir " ";Lbin$(b&);"\n ";Lbin$(Reverse32(b&))

ENDPROC

' Tests
b&=%10110011100011110000111110000000 : Testprt : imprimir
b&=%0  : Testprt : imprimir
waitinput 3000

WHILELOOP 0,31

    b&=2^&Loop
    Testprt

    ifnot b&=Reverse32(Reverse32(b&))

        imprimir "Reversing Error at ";b&,Reverse32(Reverse32(b&))
        testprt
        sound 2000,200
        waitinput

    endif

    waitinput 100

ENDWHILE

waitinput 2000

WHILELOOP 0,31

    b&=2^32-2^&Loop
    Testprt

    ifnot b&=Reverse32(Reverse32(b&))

        imprimir "Reversing Error at ";b&,Reverse32(Reverse32(b&))
        testprt
        sound 2000,200
        waitinput

    endif

    waitinput 100

ENDWHILE

waitinput 3000

whileloop 5000

    if &Loop/50 mod 2

        Título de la ventana "  AUTO TEST MODE running Test Nr. "+str$(&Loop)

    más

        Título de la ventana "                                              "+\
        "Test Nr. "+str$(&Loop)

    endif

    b&=rnd(2^31-1)*(1-2*(rnd()<0.33))

    ifnot b&=Reverse32(Reverse32(b&))

        imprimir "Reversing Error at ";b&,Reverse32(Reverse32(b&))
        testprt
        sound 2000,200
        waitinput

    endif

    waitinput 22
    Case %key=27:romper

endwhile

imprimir "\n Random Tests:"

WHILELOOP 1000

    b&=rnd(2^31-1)*(1-2*(rnd()<0.5))
    Testprt
    Waitinput 2000
    caso %key=27:BREAK

ENDWHILE

imprimir "\n Tests done. BYE!"
Waitinput 4000
FIN
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
30.05.2021  
 



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

3.729 Views

Untitledvor 0 min.
RudiB.07.03.2022
p.specht21.11.2021
R.Schneider20.11.2021
Uwe Lang20.11.2021
Más...

Themeninformationen

Dieses Thema ha 1 subscriber:

p.specht (6x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie