boolean array = byte array (platzverbrauch)

Status
Nicht offen für weitere Antworten.
B

Bebbo Erbse

Gast
Hallo Forum!
Wird für jeden boolean Wert in einem eindimensionalem boolean array auch nur 1 Bit im Arbeitsspeicher reserviert?
Oder wird für jeden Wert ein Byte reserviert. Dann wäre das ja der selbe Platzverbrauch für einen byte-array.
Ich müsste das wissen, weil ich möglichst effizient rechenoperationen mit bit arrays programmieren möchte. Bis jetzt habe ich byte-arrays verwendet, aber boolean wäre platztechnisch vielleicht besser?
 

0xdeadbeef

Top Contributor
Falls boolean bitweise gespeichert würde (was ich energisch bezweifle), würde das zwar Platz sparen, aber sicher massiv Laufzeit kosten. Das Lesen/Schreiben eines Bits braucht bei den meisten Prozessoren mehrere Zyklen, während ein einfacher Lese-/Schreibzugriff üblicherweise 1 oder maximal 2 Zyklen braucht.
Außerdem hast Du auf sowas unter Java eh keinen Einfluß. Wenn die JVM auf einem exotischen Prozessor beschließt, ein Bit in ein 32bit-Wort anzuspeichern, dann tut sie das eben.
 
B

Bebbo Erbse

Gast
Gut, vielen Dank!
Das würde dann wohl auch mehr in Assemblerrichtung gehen um die Ansprüche optimal umzusetzen. Dann weiß ich wenigstens, dass es nicht effizienter geht :)
 

Kawa-Mike

Mitglied
In Java gibt es die Klasse Bitset.
Dort hast du eine Meng von Bits, die die Zustände 1 oder 0 annehmen können und nur 1 Bit Speicherplatz benötigen.
Die Zugriffe sollen sehr perfomant sein.
 

0xdeadbeef

Top Contributor
Wenn man sich z.B. die Implementierung von BitSet.set ansieht, wird schnell klar, daß man sich für den gesparten Platz einen ziemlichen Laufzeitoverhead an den Hals hängt:

Code:
   public void set(int bitIndex) {
	if (bitIndex < 0)
	    throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);

        int unitIndex = unitIndex(bitIndex);
        int unitsRequired = unitIndex + 1;

        if (unitsInUse < unitsRequired) {
            ensureCapacity(unitsRequired);
            bits[unitIndex] |= bit(bitIndex);
            unitsInUse = unitsRequired;
        } else {
            bits[unitIndex] |= bit(bitIndex);
        }            
    }

Und wie gesagt: alleine der Read-Modify-Write-Zugriff per "|=" ist bereits sehr viel teuerer als ein einfacher Speicherzugriff, zumal der Arrayzugriff hier ja auch noch zusötzlich erfolgt.
 

Ark

Top Contributor
Hehe, dieses Problem kenne ich zur Genüge (bin bei solchen Sachen auch immer neidisch auf Assembler *g*), darum habe ich auch so meine Vorstellungen davon, dieses Problem zu lösen. :)

Verwendet man dazu z. B. ein int-Array, dann kann von n Bits auf das Bit i wie folgt zugegriffen werden:
Code:
// Testen auf 0:
(bits[i>>>5]&1<<i)==0

// Testen auf 1:
(bits[i>>>5]&1<<i)!=0

// Setzen:
bits[i>>>5]|=1<<i;

// Löschen:
bits[i>>>5]&=~(1<<i);

// Invertieren:
bits[i>>>5]^=1<<i;

So, hoffentlich habe ich keine Fehler gemacht. :lol: Ein i%32 bzw. i&31 ist übrigens nicht notwendig; wie ich gerade nachgelesen habe, verwenden die Schiebeoperatoren entsprechend des Datentyps nur die unteren 3 (byte), 4 (short), 5 (int) oder 6 (long) Bits des Operanden auf der rechten Seite.

Im Prinzip ist das hier nichts weiter als ein BitSet, nur muss man hier nicht ständig öffentliche Methoden aufrufen und kann bzw. muss selbst entscheiden, ob eine Bereichsüberschreitung abgefangen werden soll. Die Zählung von i beginnt natürlich bei 0, und die Konstante 5 muss natürlich angepasst werden, wenn kein int verwendet wird (sondern vielleicht long oder short). Außerdem prüft hier niemand, ob das Bit in einem festgelegten Bereich liegt, denn durch das Verwenden dieser nativen Datentypen entsteht ein (minimaler) „Verlust“, da in einem byte/short/int/long unter Umständen mehr Bits gespeichert werden als tatsächlich notwendig sind. Die Größe des int-Feldes muss für die Anzahl der zu speichernden Bits entsprechend berechnet werden.

Ich denke, diese Implementierung zum Arbeiten mit Bits in Arrays ist die effizienteste, wenn man bedenkt, dass das Arbeiten mit reinen boolean- oder byte-Arrays mit jedem Datum 7 Bit Datenmüll erzeugt. Damit reduziert sich der Speicherplatzverbrauch auf 1/8 bei hoffentlich verschmerzbarem Rechenaufwand, der aufgrund der Bitoperationen minimal ist. Wenn das immer noch zu langsam ist, muss der Assembler herhalten. ;)

MfG
Ark
 

Kawa-Mike

Mitglied
Klar,
Assembler ist schneller schneller als Java, aber . . .
Du könntest auch in klassischen C ( ohne ++ ) sehr schoen und schnell die Bits fliegen lassen (-,
A B E R so eine Implemnetierung ist Hardwareabhängig ! Du machst da annahmen vieviele Byte ein int ( long, short .. ) tatsächlich hat und wie es im RAM dargestellt wird, also die Reihenfolge der BYTES und NIBBLES (LOW- and HIBITS). Ich kann mich dunkel Erinnern, das dies variieren kann.

Gruss
Mike
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Boolean Array Allgemeine Java-Themen 4
A Boolean Array in Allgemeine Java-Themen 3
E boolean Array in ein byteArray mit derLänge 5 Allgemeine Java-Themen 6
L Fehler mit Boolean. (Glaube ich zumindest) Allgemeine Java-Themen 6
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
J Boolean EventListener Allgemeine Java-Themen 2
E Boolean aus Klasse A als String in Klasse B ausgeben Allgemeine Java-Themen 4
A boolean und prozesse Allgemeine Java-Themen 2
S Werte aus 2 eindimensionale boolean arrays mithilfe von logischen operatoren berechnen Allgemeine Java-Themen 6
Z Boolean Abfrage gibt kein Boolean zurück, aber warum? Allgemeine Java-Themen 6
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
B boolean return typ verwenden? Allgemeine Java-Themen 5
D falsche Annahme nach korrekter Auswertung (if, boolean) Allgemeine Java-Themen 2
S Boolean Ausgabe JasperReports Allgemeine Java-Themen 2
I Probleme mit Boolean-Methode Allgemeine Java-Themen 4
D Boolean Listener? Allgemeine Java-Themen 28
R boolean im Bean abfragen Allgemeine Java-Themen 18
D public boolean return Allgemeine Java-Themen 8
S Problem mit Boolean Variablen Allgemeine Java-Themen 8
J Vector - Boolean Allgemeine Java-Themen 24
H boolean wert ändern Allgemeine Java-Themen 2
L boolean aus der main übergeben? Allgemeine Java-Themen 12
C public boolean containsAll(Collection c) Allgemeine Java-Themen 2
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
M Array Rang eines Elements Allgemeine Java-Themen 4
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
noah1407 Array Allgemeine Java-Themen 3
D Methoden Teil-Array mit Maximalwert bestimmen Allgemeine Java-Themen 23
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
N zweidimensionalen Array in dreidimensionalen Array speichern Allgemeine Java-Themen 4
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
L Array und Index Allgemeine Java-Themen 26
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
Willi.We Array sortieren Allgemeine Java-Themen 5
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
H Array Sportschütze Allgemeine Java-Themen 6
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
M Array verändern Allgemeine Java-Themen 1
A JavaFX 2 dimensionales array Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
parrot Array Aufgabe Allgemeine Java-Themen 3
N String Array Eingabe Allgemeine Java-Themen 6
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
A Array Problem Allgemeine Java-Themen 8
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
F Datei in String-Array einlesen Allgemeine Java-Themen 8
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
F 3 Dimensionales Array mit Allgemeine Java-Themen 9
M Steueralgorithmus verwandelt Array in Anfangszustand Allgemeine Java-Themen 9
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
T Objekt in Array packen Allgemeine Java-Themen 6
M Zahlen in Array anordnen Allgemeine Java-Themen 8
M Eclipse Unvollständigen Array ansteuern Allgemeine Java-Themen 2
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Variablen Array ertellen bei model.put Allgemeine Java-Themen 13
S Eindimensionales Array in zweidimensionales Array speichern Allgemeine Java-Themen 5
R convert 2d array list to 2d array Allgemeine Java-Themen 1
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
L Datentypen 3D Array Allgemeine Java-Themen 3
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
E Swing Array mit Bildern in GUI darstellen Allgemeine Java-Themen 2
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
M Zweidimensionales Array mit Binärzahlen füllen Allgemeine Java-Themen 8
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben