Bitweise Verarbeitung?

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
 
S

sebastian4gold

Gast
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
 

byte

Top Contributor
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.
 
S

sebastian4gold

Gast
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
 

Ark

Top Contributor
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
 
S

sebastian4gold

Gast
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Bitweise Operatoren" >>>",">>","<<" erklärung Java Basics - Anfänger-Themen 5
P Bitweise Operatoren Java Basics - Anfänger-Themen 2
Phillip Bitweise Operatoren Java Basics - Anfänger-Themen 11
A Bitweise Operatoren Java Basics - Anfänger-Themen 1
Z Bitweise tauschen Java Basics - Anfänger-Themen 12
A string bitweise in long umwandeln Java Basics - Anfänger-Themen 7
G Logische und Bitweise Operatoren Java Basics - Anfänger-Themen 2
M Datentypen Bitweise Dividieren Java Basics - Anfänger-Themen 3
J Bitweise addieren Java Basics - Anfänger-Themen 6
V Bitweise Operatoren in der Grafikprogrammierung Java Basics - Anfänger-Themen 2
S byte-array bitweise auslesen Java Basics - Anfänger-Themen 14
S Bitweise Buchstaben verändern! Java Basics - Anfänger-Themen 26
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
A Java, verarbeitung eines xml-files Java Basics - Anfänger-Themen 2
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20
C Verarbeitung von sehr großen Dateien Java Basics - Anfänger-Themen 52
P Variablen Abfangen von eingaben per java.util.Scanner und weiter Verarbeitung Java Basics - Anfänger-Themen 7
M Zeitgemäße Verarbeitung von Datumswerten in Java Java Basics - Anfänger-Themen 1
Z Objekte in der Verarbeitung stoppen Java Basics - Anfänger-Themen 2
S Arrays - Fehler bei der Verarbeitung: For input string: "Berlin" Java Basics - Anfänger-Themen 14
C Wie am besten die Verarbeitung der Eingabe verzögern ? Java Basics - Anfänger-Themen 5
G Frage zur Verarbeitung einer JSP Java Basics - Anfänger-Themen 4
G via Reflections art der verarbeitung der parameter prüfen Java Basics - Anfänger-Themen 11
H Verarbeitung von Zeichenketten Java Basics - Anfänger-Themen 8
D Problem mit der Verarbeitung eines ActionEvents Java Basics - Anfänger-Themen 7
8 Hilfe bei Trennung von GUI und Verarbeitung Java Basics - Anfänger-Themen 12
S Verarbeitung 2er KeyEvents gleichzeitig Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben