Aufgabe zu Bitoperationen mit Java

Hallo!
Ich sitzte nun schon längere Zeit an folgender Aufgabe:

Ich soll folgendes Java-Programm schreiben:
/* Die Klasse PruefeLong beinhaltet das Einlesen einer Long-Zahl und die Überprüfung ob:

  • die letzten 3 Bit auf eins gesetzt sind (die Bits rechts)
  • die letzten 3 Bit auf 0 gesetzt sind (die Bits rechts)
  • die ersten 3 Bit auf 1 gesetzt sind(ohne Verwendung von Bit-Schiebeoperationen) (die Bits links)
  • die ersten 3 Bit auf 1 gesetzt sind (mit Verwendung von Bit-Schiebeoperationen) (die Bits links)
  • die letzten 3 unterschiedlich gesetzt sind (also 101,oder 001, jedoch nicht 000 oder 111)
    */
    Weiterhin kann ich über die Klasse „FormatierteAusgabe“ verfügen. Dabei ist folgender Methodenaufruf rellevant, um mir die Binärdarstellung der eingegebenen Long-zahl anzeigen zu können:
    „FormatierteAusgabe.binaerAusgabe(long eingegebenelongzahl,int bitanzahl);“
    Die Eingabe von Konsole der Longzahl erfolgt mit:
    „Long zahl=TastaturEingabe.readLong(„Ihre Eingabe:\n“);“
    Dies funktioniert auch reibungslos.

Aber nun zu den einzelnen Aufgaben, die innerhalb der Klasse PruefeLong gelöst werden müssen.
Zunächst mal: Prüfen, ob die letzten 3 Bits 1 oder 0 sind.

  1. Frage: Was sind die letzten 3 bits? Angenommen ich hätte für die Bitanzahl 16 Bit gewählt und gebe als Longzahl z.B. 71 ein.
    Das entspricht der formatierten Ausgabe (als Binärzahl) von 0000000001000111.
    Meiner Meinung nach sind jetzt die lezten 3 Bits aber „100“, d.h. die links „angehängten“ Nullen sind irrelevant und mit den letzten Bits meint man die von der Wertigkeit höchsten 3 Bits, also die 3 Bits die ganz links von der eigentlichen Zahl stehen. Ist meine Annahme so korrekt?

  2. Frage: Jetzt kann ich aber nicht über die Binärzahl, die ich durch den Methodenaufruf „FormatierteAusgabe.binaerAusgabe(long eingegebenelongzahl,int bitanzahl);“ erhalte verfügen, weil mir ein Void-Typ geliefert wird. Also muss ich mir Hilfe von Bit-Operatioenn (also &,|,^,~, >>,>&gt:wink: und einer Maskierung arbeiten. Aber wie stelle ich das jetzt am besten an? Gemäß obiger Bitanzahl würde ich also z.B. die Maskierung, die „111“ beinhaltet (Zahl 7) wählen, und diese dann mit meiner Long-Zahl mittels „&“ vergleichen. Aber wie geht das konkret, denn ich muss ja die Bitanzahl beachten und eben nur die leztzen 3 Bit mittels binärem Und ("&") vergleichen.

Ich bin für jeden Rat dankbar. Ich denke, dass es nicht allzu schwer sein wird. Aber momentan bin ich etwas perplex…

Bielen Dank für Eure Hilfe,
Gruß, Ralf

Hallo!

  • die letzten 3 Bit auf eins gesetzt sind (die Bits rechts)
  • die ersten 3 Bit auf 1 gesetzt sind(ohne Verwendung von Bit-Schiebeoperationen) (die Bits links)
  1. Frage: Was sind die letzten 3 bits? Angenommen ich hätte
    für die Bitanzahl 16 Bit gewählt und gebe als Longzahl z.B. 71
    ein.
    Das entspricht der formatierten Ausgabe (als Binärzahl) von
    0000000001000111.
    Meiner Meinung nach sind jetzt die lezten 3 Bits aber „100“,

Bringst Du da nicht *erste* und *letzte* durcheinander? Oben steht, dass die letzten Bits die rechts sind, die letzten 3 also in Deinem Beispiel „111“. Und um auch Deine eigentliche Frage anzuschneiden, die ersten (linken) 3 Bits sind „000“, denn die Methode heißt ja „PruefeLong“ und ein Long besteht nunmal aus einer festen Anzahl Bits und 71L hat nunmal links „zufällig“ dreimal „0“.

Jan

Ups! Da hab ich meine eigenen Kommentare vergessen, rauszunehmen.
Die Aufgabenstellung hieß ursprünglich:

Ich soll folgendes Java-Programm schreiben:
/* Die Klasse PruefeLong beinhaltet das Einlesen einer Long-Zahl und die Überprüfung ob:

  • die letzten 3 Bit auf eins gesetzt sind
  • die letzten 3 Bit auf 0 gesetzt sind
  • die ersten 3 Bit auf 1 gesetzt sind(ohne Verwendung von Bit-Schiebeoperationen)
  • die ersten 3 Bit auf 1 gesetzt sind (mit Verwendung von Bit-Schiebeoperationen)
  • die letzten 3 unterschiedlich gesetzt sind (also 101,oder 001, jedoch nicht 000 oder 111)
    */
    Meine Frragestellungen bleiben gleich.
    Und mit den 3 letzten Bits bin ich eben jetzt der Meinung, dass das die am weitesten rechts stehenden Bits sind und zwar unabhängig davon, wie groß ich die Bitanzahl wähle. Also nochmal das Beispiel mit der 71. Das entspricht 0000000001000111, wenn ich als Bitanzahl 16 wähle.
    Wähle ich als Bitanzahl z.B. 8 dann würde das doch 01000111 entsprechen.
    Und eigentlich kann man doch davon ausgehen, dass natürlich die letzen 3 Bits von der eigentlichen Zahl gemeint sind, oder? also eben „100“, weil die 71 halt eigentlich "100"0111 ist. Deshalb finde ich es ja irgendwie schwierig, zu prüfen, ob jetzt da z.B. "111"001 steht, oder nicht. Aber dann wäre für den Fall „000“ immer 0.
    Naja, ich hoffe ich hab dich nicht zu sehr verwirrt.
    Trotzdem vielen Dank für Deine Hilfe.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Und mit den 3 letzten Bits bin ich eben jetzt der Meinung,
dass das die am weitesten rechts stehenden Bits sind

Ok.

und zwar
unabhängig davon, wie groß ich die Bitanzahl wähle. Also
nochmal das Beispiel mit der 71. Das entspricht
0000000001000111, wenn ich als Bitanzahl 16 wähle.
Wähle ich als Bitanzahl z.B. 8 dann würde das doch 01000111
entsprechen.

Ok. Wobei die Angabe einer Bitanzahl ja offensichtlich nur für binaerAusgabe() relevant ist, um eine einigermaßen „humane“ Darstellung zu bekommen. Die Klasse PruefeLong() respräsentiert ja nur ein Long mit eben 64 bit.

Und eigentlich kann man doch davon ausgehen, dass natürlich
die letzen 3 Bits von der eigentlichen Zahl gemeint sind,
oder? also eben „100“, weil die 71 halt eigentlich "100"0111
ist.

Wieso hier schon wieder die letzten 3 Bits? Die letzten 3 Bits sind doch „111“,
zumindest wenn Deine Feststellungen davor korrekt sind. Aber selbst wenn Du die ersten 3 Bits meintest, sind es die ersten 3 der 64 Bits, die ein Long umfasst (wobei hier das Vorzeichenbit mit drin wäre). Was wären denn nach Deiner Lesart die ersten 3 Bits der Zahl 3?

Jan

Naja, die letzten 3 Bits der Zahl 3 wären 011, unabhängig davon, ob ich z.B. 00000011 oder 0000000000000011 wähle.
Aber 011 das wären bei der Zahl 3 auch die ersten 3 Bits.
Anderes Beispiel: die Zahl 15: das entspricht 110011. Da wären jetzt die letzten 3 Bits 110 und die ersten 3 bits 011 und zwar alles auch wieder unabhängig von der Größe der Bitanzahl, die ja wie du bereits sagtest nur zur besseren Darstellung dient.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Anderes Beispiel: die Zahl 15: das entspricht 110011. Da wären
jetzt die letzten 3 Bits 110 und die ersten 3 bits 011

Wie heißt denn das Zeugs, das Du da gerade rauchst? :wink:

 11010101101110101101010101101010011
 ^ ^
 | |
 +---linkestes, erstes Bit |
 |
 rechtestes, letztes Bit---+

Das unterschreibst Du jetzt erstmal und dann kommen wir vielleicht nochmal zum eigentlichen Problem.
Jan