Bitweise Verarbeitung?

  • Themenstarter Themenstarter sebastian4gold
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

sebastian4gold

Gast
Hallo!

Ich würde ganz gerne Bit-weise arbeiten. Ich möchte ein Dateiformat verarbeiten, das leider sehr seltsam aufgebaut ist und in dem ich bits auslesen können muss.

Also am besten, eine komplette Datei als boolean-Array einlesen (geht das?) und dann damit arbeiten.

Dann müsste ich aber wieder gewisse bits in Datenfelder (Java-Variablen Typen umwandeln) können:
Z.B. short s = (short) bytearray;

(Ich will nur Anregungen zur bitweisen Verarbeitung haben, keine Komplettlösung, wie es andere von euch verlangen: Macht mal meine Hausaufgaben.... 😉

Alles was ihr habt: Bitte her damit!


Vielen Dank & Grüße,
Sebastian
 
Vielen Dank byto, nur hilft mir dies nur bedingt weiter.

Fällt wirklich keinem eine Idee ein, wie ich bits auslesen kann (also wahr und falsch oder eins und null) ???

B.z.w. wie ich dann aus den bits wieder z.B. ein char-Objekt machen kann??

Es gibt doch in Java jede Menge bit-Operationen (wie in jeder Sprache 😉 - nur kann ich damit nicht viel anfangen. Kann man z.B.
Die Zahl 5
(00101) nicht irgenwie in seine einzelnen Bits zerlegen?
Also 1 und 4 ????

Oder besser gesagt, kann ich irgendwie manche Stellen auf null setzen? Gibt es da geeignete Schiebe Operationen, oder lässt sich etwas mit X-Or realisieren????


Viele, verwirrte Grüße,
Sebastian
 
Integer.toBinaryString(int) liefert Dir z.b. die binäre Repräsentation. Aber wenn Du auf Bitebene arbeiten bzw. rechnen willst, dann tust Du das für gewöhnlich auf ints (bzw. auf einem primitiven Datentyp). Du kannst dann einzelne Bits durch Bitmasken auslesen.

Guck Dir die Streams nochmal genau an. Da hast Du Methoden, um Dir die Bytes einzulesen:

int read(byte[] b, int off, int len)
Reads up to len bytes of data from the input stream into an array of bytes.
 
Das mit den verschiedenen Inputstreams war mir klar.

Aber das mit den Bitmasken. Das ist was.
Wie genau sollen die funktionieren??

Wie komme ich von byte zum bit?

Ich rätse zwar schon seit langem, wie man mit den verschiedenen Bit-Operanten tatsächlich arbeitet, habe es dann aber immer als nicht so wichtig abgetan.

Jetzt noch einen kleinen kick, byto, dann komme ich auf eigenen Beinen wieder hoch.

Vielen Dank!

Sebastian
 
Gehen wir mal vom Datentyp byte aus.

Zum Testen, ob ein Bit gesetzt ist oder nicht, geht man so vor:
Code:
if((b&1<<i)!=0) //tue etwas, falls Bit i in b gesetzt ist
Anders ausgedrückt: Wenn du wissen willst, ob bestimmte Bits gesetzt sind, musst du einfach die zu untersuchenden Bits setzen und mit dem zu testenden Byte UND-verknüpfen, das Ergebnis prüfst du dann auf ungleich 0, und wenn ja, dann war mindestens eines dieser Bits gesetzt. 😉

Bei einer ODER-Verknüpfung ist gesichert, dass das entsprechende Bit anschließend gesetzt ist:
Code:
b|=1<<i;
Mittels UND kann man gezielt Bits ausschalten; überall, wo eine 0 steht, wird auch im Resultat eine Null stehen. Um Bit i zu löschen, kann man so vorgehen:
Code:
b&=~(1<<i);
Schließlich ist es mit der ENTWEDER-ODER-Verknüpfung möglich, Bits umzudrehen; die entsprechenden Bits müssen in der Maske auf 1 gesetzt werden:
Code:
b^=1<<i;

Ach ja: Diese 1<<i kannst du natürlich auch vorher ausrechnen, falls i konstant ist. 😉

Dann gibt's da noch Schiebebefehle...

Code:
b<<=n;
Dadurch werden die Bits in b um n Stellen nach links verschoben. Es entspricht einer Multiplikation mit 2 hoch n.

Code:
b>>=n;
Dadurch werden die Bits in b um n Stellen nach rechts verschoben. Es entspricht einer Division durch 2 hoch n.

Code:
b>>>=n;
Dadurch werden die Bits in b um n Stellen nach rechts verschoben. Es entspricht einer Division durch 2 hoch n. Hier wird allerdings davon ausgegangen, dass die Zahl vorzeichenlos ist, sprich: Das MSB wird mit nach rechts verschoben und durch eine 0 ersetzt. Diese Verschiebung nennt sich logisch, die anderen beiden waren arithmetisch, wobei die Linksverschiebung immer beides zugleich ist, weil hier das Vorzeichen nicht beachtet werden kann: Das Ergebnis wäre bei einem Überlauf so oder so falsch.

Wie das alles zusammenhängt, erkläre ich später vielleicht mal genauer. Du kannst dich auch mit Assembler auseinandersetzen, denn da musst du das im Schlaf können. 😉

MfG
Ark
 
Also Assembler ist für mich eigentlich kein Problem.
(Nicht MASM - der MS Schrott - sondern Nasm. Hab damit schon oft kleine "use it without any os, just boot by floopy"-Porgramme geschrieben, die aufwendige Statistiken etc. schneller berechnet haben, als die Win Version.
(ASM: 7 Stunden, Unter Win: 8,2 Stunden)

ALSO VIELEN DANKE Java-Forum!

Sebastian
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben