| |
|
|
p.specht
| Bitleisten (ici dans purem XProfan11) devoir comme speicherplatz-sparende Version de massenhaften 2-Zustands-Sauver, etwa chez qui réalisation eines schnellen Primzahlenfilters* ou bien dem indexierten Löschvermerk einer banque de données dienen.
cela nachfolgende Machwerk est un allererster Versuch en supplément, ist mais assez lente. Pour qui Praxis wären flottere Lösungen, etwa avec Bereichsvariablen et per Assembler ou bien juste per Windows-API gefragt.
Titre de la fenêtre " Simulation de 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!)
si max!<0:faute():Imprimer " Negative Indizes dzt. pas vorgesehen! *** "
max!=0:waitinput :goto "huch"
endif
si max!>2147483615:faute():Imprimer " Max.index dzt.2^31-32-1= 2147483615, GT. INT()"
max!=2147483615:waitinput :goto "huch"
endif
z&=int(max!/32+1):setsize dw&[],z&
Imprimer " en supplément wurden ";z&;" Long&-Variablen alloziert."
imprimer " Probe: 32*";z&;"=";int(z&*32);" bit":imprimer
REPEAT
nochmal:
idx!=fetch(" bit-index: ",idx!)
si idx!>max!
faute()
imprimer " Obergrenze ";int(max!);" überschritten! *** \n"
color 0,15:idx!=max!:goto "nochmal"
elseif idx!<0:faute():imprimer " Negative Indizes sommes pas vorgesehen! *** \n"
color 0,15:idx!=0:goto "nochmal"
endif
dwx&=int(idx!/32)
bitImLong&=int(idx!-dwx&*32)
bw&=@Test peu(dw&[dwx&],bitImLong&)
z$=" Long&["+str$(dwx&)+"] : bit["+str$(bitImLong&)+"] ?= "
bw1&=fetch(z$,bw&)
bw1&=(bw1&<>0)
si bw&<>bw1&: dw&[dwx&]=setbit(dw&[dwx&],bitImLong&,bw1&)
color 1,15:locate %csrlin-1,31
imprimer ":bit[";int(idx!);"] ist eh bien ";bw1&:color 0,15
endif
imprimer
si idx!>=max!
idx!=max!
imprimer " *** avertissement: Obergrenze erreicht! ***"
d'autre
idx!=int(idx!)+1
endif
ENDWHILE
FIN
proc fetch :parameters txt$,idx! :declare z$
imprimer txt$;int(idx!):locate %csrlin-1,len(txt$)+1:input z$
cas %csrlin>19:cls
return si(z$=»,idx!,val(z$))
endproc
proc faute
color 12,15
imprimer " *** FEHLER:";
sound 500,100
endproc
Anmerkung: avec Floating-Point-Ganzzahlen pourrait on im Bereich +/- 9007199254740992 correct bits indexieren, - nimmt on cela Vorzeichenbit aussi encore avec, ensuite allez qui Bereich de 0 - 18 014 398 409 481 984. Theoretisch pourrait on avec cela un Eratosthenes-filtre pour ca. qui ersten 720 Bio. Primzahlen aufbauen (Geschätzte Primzahldichte quelque chose sous 4%) - allerdings: wohin Sauver wir qui 2048 Terabyte qui Bitleiste? (de qui Rechenzeit gar pas trop reden...). Selbst si wir Runlenght-Encoden ist le reste toujours 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 ========= Pour une Rechtecksmatrix-InPlace-Transposition était un Status-Doppelbitleiste (Bibit-peigne) avec den möglichen Werten {0,1,2,3} erforderlich. bien sûr doit on aussi cela dans qui Praxis encore clever beschleunigen, mais cela Prinzip klappt déjà la fois.
qui service des Machwerks ist quelque chose gewöhnungsbedürftig (mais letztendlich soll cela de toute façon qui ordinateur faire): Einzugeben sommes stets qui index-Wert, ensuite wird qui Ist-Zustand des relevanten Doppelbits angezeigt et peux par den neuen Zustand (0..3) ersetzt volonté.
Titre de la fenêtre "Bibit-Leiste aus 2il-Bitgruppen z.B. pour Bearbeitungsstatus-Werte 0,1,2,3"
'CopyLeft (CL) 2012-12ff by P. Specht. Jedwede la responsabilité ist ausdrücklich ausgeschlossen!
randomize:font 2:Cls rnd(8^8)
Déclarer max&,idx&,wert&,lx&,bbiL&,dans$
Imprimer " Max.Bibit-Indexwert = ";:input max&
Déclarer bb&[max&/16]
Imprimer " Anzahl benötigter Longs: ";int(max&\16+1)
bb&[0]=rnd(4294967295):imprimer " Test bb&[0]:Bibit-Idx:15__0: ";suis$(bb&[0])
Repeat
imprimer "\n Bibit-index: ";idx&,»,:input idx&
lx&=idx&\16:imprimer " bb-idx=";lx&
bbiL&=(idx& mod 16)*2:imprimer " bbiL&=";bbiL&
wert&=(bb&[lx&] & (3<<bbiL&))>>(bbiL&)
imprimer " Ist:",wert&," Soll:",:input dans$
si dans$>»
wert&=val(dans$) mod 4
bb&[lx&]=bb&[lx&] & (4294967295-(3<<bbiL&)) | (wert&<<bbiL&)
wert&=(bb&[lx&] & (3<<bbiL&))>>bbiL&
locate %csrlin-1,30:imprimer "... ist nun",wert&
endif
until 0
Fin
|
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 16.06.2021 ▲ |
|
|
|