Italia
Experimente

Bitleisten und BiBit-Leisten

 

p.specht

Bitleisten (hier in purem XProfan11) sollen als speicherplatz-sparende Version von massenhaften 2-Zustands-Speichern, etwa bei der Realisierung eines schnellen Primzahlenfilters* oder dem indexierten Löschvermerk einer Datenbank dienen.

Das nachfolgende Machwerk ist ein allererster Versuch dazu, ist aber ziemlich langsam. Für die Praxis wären flottere Lösungen, etwa mit Bereichsvariablen und per Assembler oder gleich per Windows-API gefragt.
WindowTitle " Simulation von bit-Leisten mittels Long&-Arrays (beta)"
' Copyleft (CL) 2012-12 by P. Specht; OHNE GEWÄHR!
declare z$,z&,idx!,max!,dw&[],dwx&,bw&,bw1&,bitImLong&
huch:
cls:font 2:color 0,15
max!=fetch(" Höchster vorkommender bit-Index [ab 0]?: ",max!)

if max!<0:fehler():Print " Negative Indizes dzt. nicht vorgesehen! *** "

    max!=0:waitinput :goto "huch"

endif

if max!>2147483615:fehler():Print " Max.Index dzt.2^31-32-1= 2147483615, wg. INT()"

    max!=2147483615:waitinput :goto "huch"

endif

z&=int(max!/32+1):setsize dw&[],z&
Print " Dazu wurden ";z&;" Long&-Variablen alloziert."
print " Probe: 32*";z&;"=";int(z&*32);" bit":print

REPEAT

    nochmal:
    idx!=fetch(" bit-Index: ",idx!)

    if idx!>max!

        fehler()
        print " Obergrenze ";int(max!);" überschritten! *** \n"
        color 0,15:idx!=max!:goto "nochmal"

    elseif idx!<0:fehler():print " Negative Indizes sind nicht vorgesehen! *** \n"

        color 0,15:idx!=0:goto "nochmal"

    endif

    dwx&=int(idx!/32)
    bitImLong&=int(idx!-dwx&*32)
    bw&=@TestBit(dw&[dwx&],bitImLong&)
    z$=" Long&["+str$(dwx&)+"] : bit["+str$(bitImLong&)+"] ?= "
    bw1&=fetch(z$,bw&)
    bw1&=(bw1&<>0)

    if bw&<>bw1&: dw&[dwx&]=setbit(dw&[dwx&],bitImLong&,bw1&)

        color 1,15:locate %csrlin-1,31
        print ":bit[";int(idx!);"] ist nun ";bw1&:color 0,15

    endif

    print

    if idx!>=max!

        idx!=max!
        print " *** Warnung: Obergrenze erreicht! ***"

    else

        idx!=int(idx!)+1

    endif

ENDWHILE

END

proc fetch :parameters txt$,idx! :declare z$

    print txt$;int(idx!):locate %csrlin-1,len(txt$)+1:input z$
    case %csrlin>19:cls
    return if(z$="",idx!,val(z$))

endproc

proc fehler

    color 12,15
    print " *** FEHLER:";
    sound 500,100

endproc


Anmerkung: Mit Floating-Point-Ganzzahlen potuto man im Bereich +/- 9007199254740992 fehlerfrei bits indexieren, - nimmt man das Vorzeichenbit auch noch mit, dann geht der Bereich von 0 - 18 014 398 409 481 984. Theoretisch potuto man damit ein Eratosthenes-Filter per ca. die ersten 720 Bio. Primzahlen aufbauen (Geschätzte Primzahldichte etwas unter 4%) - allerdings: Wo speichern wir die 2048 Terabyte der Bitleiste? (Von der Rechenzeit gar nicht zu reden...). Selbst wenn wir Runlenght-Encoden ist das noch immer gewaltig...
 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
16.06.2021  
 




p.specht

Bibit-Leiste
=========
Für eine Rechtecksmatrix-InPlace-Transposition war eine Status-Doppelbitleiste
(Bibit-Kamm) mit den möglichen Werten {0,1,2,3} erforderlich. Selbstverständlich muß man auch das in der Praxis noch clever beschleunigen, aber das Prinzip klappt schon mal.

Die Bedienung des Machwerks ist etwas gewöhnungsbedürftig (aber letztendlich soll das ohnehin der Computer machen): Einzugeben sind stets der Index-Wert, dann wird der Ist-Zustand des relevanten Doppelbits angezeigt und kann durch den neuen Zustand (0..3) ersetzt werden.

WindowTitle "Bibit-Leiste aus 2er-Bitgruppen z.B. per Bearbeitungsstatus-Werte 0,1,2,3"
'CopyLeft (CL) 2012-12ff by P. Specht. Jedwede Haftung ist ausdrücklich ausgeschlossen!
randomize:font 2:Cls rnd(8^8)
Declare max&,idx&,wert&,lx&,bbiL&,in$
Print " Max.Bibit-Indexwert = ";:input max&
Declare bb&[max&/16]
Print " Anzahl benötigter Longs: ";int(max&\16+1)
bb&[0]=rnd(4294967295):print " Test bb&[0]:Bibit-Idx:15__0: ";bin$(bb&[0])

Repeat

    print "\n Bibit-Index: ";idx&,",",:input idx&
    lx&=idx&\16:print " bb-idx=";lx&
    bbiL&=(idx& mod 16)*2:print " bbiL&=";bbiL&
    wert&=(bb&[lx&] & (3<<bbiL&))>>(bbiL&)
    print "  Ist:",wert&," Soll:",:input in$

    if in$>""

        wert&=val(in$) mod 4
        bb&[lx&]=bb&[lx&] & (4294967295-(3<<bbiL&)) | (wert&<<bbiL&)
        wert&=(bb&[lx&] & (3<<bbiL&))>>bbiL&
        locate %csrlin-1,30:print "... ist nun",wert&

    endif

until 0

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



Zum Experiment


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

1.474 Views

Untitledvor 0 min.
p.specht18.09.2021
Uwe ''Pascal'' Niemeier23.08.2021
Thomas Zielinski13.08.2021
Ernst21.07.2021
Di più...

Themeninformationen

Dieses Thema hat 1 subscriber:

p.specht (2x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie