Deutsch
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 könnte 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 könnte man damit ein Eratosthenes-Filter für 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. für 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


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.463 Betrachtungen

Unbenanntvor 0 min.
p.specht18.09.2021
Uwe ''Pascal'' Niemeier23.08.2021
Thomas Zielinski13.08.2021
Ernst21.07.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

p.specht (2x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


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