| |
|
|
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 ▲ |
|
|
|