Bits Sparen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Matthias

Betreff: Bits Sparen

BeitragSo, Sep 24, 2006 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Hoffe mir kann jemand helfen. Und zwar geht es darum das ich viele daten habe die zwiechen 0-63 liegen also nur 6Bit wenn ich sie abspeichern
will dann verbrauche ich aber bei 4Werte auch 4Bytes also 32Bit

Aber Teoretich Könnte ich diese 4Werte auch in 3Bytes Speichern (4*6Bit=24Bit=3Bytes)

Hatt jemand eine Idee wie mann das machen könnte??

PowerProgrammer

BeitragSo, Sep 24, 2006 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Wofür brauchst du das denn?

Es geht sicher, dafür musst du nur bitmanipulation betreiben:
*KLICK*

Dann speicherst du das in Paketen...
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

BladeRunner

Moderator

BeitragSo, Sep 24, 2006 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Du verbrauchst sogar noch viel mehr Platz, da jede Int schon 4 Bytes reserviert.
Um die bits einzeln anzusprechen gibt es mehrere Möglichkeiten.

Auslesen ob ein bit gesetzt ist:
if wert AND 2^bit = true then...

bit setzen:
wert = wert or 2^bit

Um Bitfolgen zu lesen, kannst du erst mit And den gewünschten Bereich maskieren und dann mit SHR um die passenden Stellen verschieben:

gelwert = (wert and bereich) shr anzahl stellen
Beispiel:
wert = %11100
bereich = %01100
anzahl = 2
ergibt: %11 (also 3)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Dreamora

Betreff: Re: Bits Sparen

BeitragSo, Sep 24, 2006 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Matthias hat Folgendes geschrieben:
Hay. Hoffe mir kann jemand helfen. Und zwar geht es darum das ich viele daten habe die zwiechen 0-63 liegen also nur 6Bit wenn ich sie abspeichern
will dann verbrauche ich aber bei 4Werte auch 4Bytes also 32Bit

Aber Teoretich Könnte ich diese 4Werte auch in 3Bytes Speichern (4*6Bit=24Bit=3Bytes)

Hatt jemand eine Idee wie mann das machen könnte??


Mit einer Bank und Shl / Shr
Aber es ist den Aufwand von 1 Byte einsparung effektiv nicht wert, da wie immer: Speicherplatzersparnis auf kosten von performance geht. In diesem Falle auf kosten von ziemlich viel Performance.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Matthias

BeitragSo, Sep 24, 2006 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Beispiel
45=00101101
16=00100000
56=00111000
28=00011100

Also das sind jetzt 4Bytes. Da ich niemals einen Höheren Wert als 63 habe
kann ich doch die beiden nullen weg lassen

Also
45 | 16| 56| 28
101101100000111000011100
Byte1 | Byte2 | Byte3

PowerProgrammer

BeitragSo, Sep 24, 2006 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, machs doch so. Ich seh nicht, wo dein Problem ist!
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!
 

Matthias

BeitragSo, Sep 24, 2006 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt wo ich genauer darüber Nachdenke ist mir eine Idee gekommen.

Also Ich tue die Werte mit Bin eine Zeichenkette zuweisen
und schneide einfach vorne 26 Zeichen ab
Diese Zeichenkette wird an die Hauptzeichenkette angehängt

und wenn ale Werte abgearbeitet sind dan mache ich mit mid
imer schön 8Bit Teile

simi

BeitragSo, Sep 24, 2006 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du das ganze noch mit Stringoperationen machst, dann wird dein Spiel am Schluss sau lahm werden, kann ich dir sagen (aus eigener Erfahrung)..... Wink

Am einfachsten ist es, wenn du es wie gesagt mit ql:shr, ql:shl, ql:and und ql:or machst....
Zusätzlich findest du unter dem Befehl ql:ReadPixel ein Beispiel dazu, das das gleiche macht, was du willst.....

Cardonic

BeitragSo, Sep 24, 2006 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal einen kleinen Code dazu geschrieben.
Wie ich sehe, hast du inzwischen schon mehrere Antworten bekommen. Ich hoffe aber, dass dir mein Code trotzdem weiterhelfen kann.

Hier mein Code: [AUSKLAPPEN]
Graphics 640,480

SeedRnd MilliSecs()

wert1a = Rand(0,63)
wert2a = Rand(0,63)
wert3a = Rand(0,63)
wert4a = Rand(0,63)

Print Bin(wert1a)
Print Bin(wert2a)
Print Bin(wert3a)
Print Bin(wert4a)

Print

bit1 = ((wert1a Shl 2) + (wert2a Shr 4)) And 255
bit2 = ((wert2a Shl 4) + (wert3a Shr 2)) And 255
bit3 = ((wert3a Shl 6) + (wert4a Shr 0)) And 255

Print Bin(bit1)
Print Bin(bit2)
Print Bin(bit3)

Print

wert1b =                       (bit1 And 252) Shr 2
wert2b = (bit1 And 3 ) Shl 4 + (bit2 And 240) Shr 4
wert3b = (bit2 And 15) Shl 2 + (bit3 And 192) Shr 6
wert4b = (bit3 And 63) Shl 0

Print Bin(wert1b)
Print Bin(wert2b)
Print Bin(wert3b)
Print Bin(wert4b)

Print

Print wert1a + " = " + wert1b
Print wert2a + " = " + wert2b
Print wert3a + " = " + wert3b
Print wert4a + " = " + wert4b


mfg Cardonic

~Edit~ "Shl 0" und "Shr 0" können natürlich weggelassen werden; ich habe sie nur hingeschrieben, damit man den Code besser verstehen kann.
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.
 

Matthias

BeitragSo, Sep 24, 2006 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Cardonic

Das ist genau das was ich suche.

Wirklich wunderbar.
 

David

BeitragSo, Sep 24, 2006 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Matthias hat Folgendes geschrieben:
Jetzt wo ich genauer darüber Nachdenke ist mir eine Idee gekommen.

Also Ich tue die Werte mit Bin eine Zeichenkette zuweisen
und schneide einfach vorne 26 Zeichen ab
Diese Zeichenkette wird an die Hauptzeichenkette angehängt

und wenn ale Werte abgearbeitet sind dan mache ich mit mid
imer schön 8Bit Teile


DAS nenn ich mal effektiv eingesparten Speicherplatz! Wink
http://bl4ckd0g.funpic.de
 

MasterK

BeitragSo, Okt 01, 2006 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
schonmal überlegt wieviel speicherplatz die ganzen anweisungen für diese shiftereien kosten? und wozu? auf dem pc wo's ja wirklich total egal ist ob man nun ein paar byte mehr speicher braucht oder nicht?
das isses echt nicht wert.

auf konsolen (gba) oder handys KANN sowas sinn machen. aber auch da gilt es abzuwägen ob der aufwand für das ganze geshifte den gewinn an speicher wirklich wert ist.
+++ www.masterk.de.vu +++
Lila FTW!

BladeRunner

Moderator

BeitragSo, Okt 01, 2006 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, die shifterei kostet einmal Platz, und kann dann beliebig oft angewendet werden. Das Argument hinkt also ein klein wenig.
Ob es auf PC-Systemen Sinn macht sei dennoch zu bezweifeln Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

antome

!!! gesperrt !!!

BeitragSo, Okt 01, 2006 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich könnte mir z.B. folgenden Fall vorstellen bei dem Bitmanipulation einen Vorteil hat:
Angenommen man prog. ein Spiel in dem eine Figur eine bestimmte Anzahl an Gegenständen einsammeln muss, um zu testen ob sie nun alle da sind müsste man mei Integer jedes einzelne
Teil testen.
If TeilA = 1 and TeilB = 1 and TeilC = 1 ... usw.
wenn man sowas auchnoch kontnuierlich in der Haupschleife abfragen will ist ein
SetBit Teile, 1 SetBit Teile, 2 usw.wenn es gefunden wurde und
die Abfrage als
If Teile = AlleFlags

einfacher und schneller.

Man kann natürlich auch Teile = Teile + 1, Teile = Teile + 2 Teile = Teile + 4 ,+8 ,+16 usw. schreiben, aber da müsste man wieder ein extra Flag haben um zu testen ob ein Gegenstand schon einmal eingsammelt wurde (falls es mehrere davon gibt) sonst stimmt nachher die Rechnung nicht.

Es gibt sicherlich ein paar Anwendungen für Bitmanipulation aber zum Speicher sparen lohnt es sicch eher nicht.
antome
 

Matthias

BeitragSo, Okt 01, 2006 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube keiner von euch hatt richtig verstanden für was das sein Soll

Nemen wir mal an wir Haben ein TilesMap Also Dim (5000,5000) Maximale Tiles=255 Also ein Byte pro Tiles >>>100MB Ram und 25MB Festplatte

So nun Speicher ich das sowieso nicht als DimFeld Sondert als Bank also
doch 25MB So nun habe ich ein land gemacht aus Graden, Ecken und Flächen 31 Tiles Verbraucht das sind 5Bit Nun habe ich eigentlich nur noch eine datenmenge von 5000*5000*5Bit=125000000=15,625MB
anstatt 5000*5000*8Bit=200000000Bit=25MB

Ich hoffe das leuchtet jetz ein Sinn/Zweck

BladeRunner

Moderator

BeitragSo, Okt 01, 2006 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
so what? 25 MB sind heutzutage nicht mehr die Welt, und die Sparerei wird mit Massen an äusserst rechenintensiven Bitspielereien erkauft. Ich bezweifle den Nutzen, wenn Du wegen 10 MB Speicher die Rechenleistung Deines Rechners zu großen Teilen für solche Sachen belegst.
Rechenleistung ist kostbar, RAM ist eher billig. Wenn Du also nicht grade an die Grenzen der Kapazität des Durchschnitssrechners stößt würde ich es mir sparen, und dann erst mal überlegen ob ich die Karte nicht etwas kleiner gestalten kann/soll.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

stfighter01

BeitragSo, Okt 01, 2006 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
vielleicht solltest du dein universum aufteilen in mehrere blöcke a 1000*1000 und diese nur bei bedarf nachladen.
dann würdest du nicht solche massen an daten verarbeiten müssen.
damit könntest du die performance sicher empfindlich erhöhen.
Denken hilft!
 

MasterK

BeitragMo, Okt 02, 2006 1:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ich denke auch dass es sinnvoller wäre beim aufbau der map an sich zu optimieren bzw ein anderes system zu wählen statt da alles zusammen zu shiften.
+++ www.masterk.de.vu +++
Lila FTW!

TheShadow

Moderator

BeitragMo, Okt 02, 2006 9:34
Antworten mit Zitat
Benutzer-Profile anzeigen
nein shiften ist bei map gut... stellt euch vor ihr habt auf dem screen 30x24 = 720 sichtbare Tiles. Das zurückschiften der Daten für 720 tiles ist unmerklich langsamer... das Zeichnen verschlingt sagen wir mal 99% der Zeit...
man spart dafür aber viel Speicher ein...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

Dreamora

BeitragMo, Okt 02, 2006 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun es braucht natürlich ungemein viel mehr ... *nein natürlich nicht*

Und dafür zusätzliche Operationen ausführen lassen, die man für sinnvolle Dinge hätte nutzen können ...


Speziell bringt die Platzersparnis nur bedingt was.
Denn wenn man zb ein Type / Bank hat das Int Byte Int drin hat, heisst das nicht das das im RAM auch nur 11 Bytes sind ... können auch so rein kommen das sie 16 Bytes brauchen und der rest einfach nicht nutzbarer Speicher ist.

Wenn man wirklich RAM sparen will sollte man es definitiv nicht an diesen unwichtigen Daten tun. Dann sollte man sich sinnvolle Lade - Entlade Strategien für die Media überlegen, denn die sind der wirkliche Speicherauslastungsfaktor.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group