Bits Sparen
Übersicht

MatthiasBetreff: Bits Sparen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
DreamoraBetreff: Re: Bits Sparen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du das ganze noch mit Stringoperationen machst, dann wird dein Spiel am Schluss sau lahm werden, kann ich dir sagen (aus eigener Erfahrung)..... ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) 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) 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 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke Cardonic
Das ist genau das was ich suche. Wirklich wunderbar. |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! ![]() |
||
http://bl4ckd0g.funpic.de |
MasterK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group