Operationen auf Bitebene und Verschiebeoperatoren wichtig?

C

chipper

Gast
Bin gerade ganz am Anfang JAVA zu lernen mit dem "Java ist auch eine Insel" Buch.
Die bisherigen Kapitel habe ich einigermaßen verstanden, doch jetzt bin ich bei
Weitere Operatoren - Operatoren auf Bitebene angekommen.

Ist es wichtig, sich mit den Themen auszukennen unter Punkt 2.9.3 -2.9.5 ?

Verstehe nicht, warum man das bitweise macht, wenn man doch auch einfach so multiplizieren kann usw.
 

Haave

Top Contributor
Naja, ein Rechner arbeitet mit Nullen und Einsen und auch bei Java gibt es Felder, wo es auf das Bit ankommt und man Bitschiebereien betreiben kann. Als Neuling würde ich mich damit jedoch erst mal nicht aufhalten, für so nötig halte ich es für den Anfang nicht.
 

XHelp

Top Contributor
Durch die Tatsache, dass der Rechner mit Binärzahlen rechnet ist es schon hilfreich zu wissen was es ist ;)

[EDIT]Ich finde, dass es zu den Grundlagen gehört und wirklich tiefgründig wird ja das Thema da nicht behandelt[/EDIT]
 
Zuletzt bearbeitet:
C

chipper

Gast
bei dem logischen rechtsverschieben:
Java:
System.out.println( -2 >>> 1);

warum kommt da
2147483647
?

binär ist 2 ja
00000010
doch wie stellt sich das vorzeichen bit dar?
also was ist -2 binär geschrieben?
 

XHelp

Top Contributor
Stichwort "Zweierkomplement"
Das 1. Bit ist für das Vorzeichen reserviert
Int ist 32 bit lang, d.h. du kannst damit die Werte von -2^31 bis 2^31 darstellen
2 ist
Code:
0[29 mal 0]10
mit Zweierkomplement-Darstellung ist -2
Code:
1[29 mal 1]11
>>> ist der shift Operator ohne Beachtung von vorzeichen
Wenn du also diene -2 shiftest, bekommst du 01[29mal 1]1
Das 1. Bit wird weiterhin als Vorzeichen interpretiert. Und dadurch kommt es auch zu einer Zahl die 2^31 ist.

[EDIT]Und wieder ein Doppelpost... heute ist einfach nicht mein Tag[/EDIT]
 
Zuletzt bearbeitet:
C

chipper

Gast
OK
Ist das jetzt nur bei der 2 so oder immer, dass 0 positives Vorzeichen und 1 negativ?

Die Riesenzahl, die rauskommt ist dann die ganzen stellen zusammegerechnet, also 2^29+2^28 usw. oder?
 

XHelp

Top Contributor
Wie man die Binärzahlen bildet, habe ich eigentlich verstanden, nur das mit dem Verschieben halt nicht.
OK
Ist das jetzt nur bei der 2 so oder immer, dass 0 positives Vorzeichen und 1 negativ?
Sicher, dass du es verstanden hast? ;) Ja, das ist immer so (bei vorzeichenbehafteten Zahlen)

Die Riesenzahl, die rauskommt ist dann die ganzen stellen zusammegerechnet, also 2^29+2^28 usw. oder?
Öhm, jaaaa... Die Binärzahl die rauskommt ist das Ergebnis. Verstehe die Frage nicht so ganz.
 

Schumi

Bekanntes Mitglied
Ist es wichtig, sich mit den Themen auszukennen unter Punkt 2.9.3 -2.9.5 ?

Ich denke, die Frage ob das Wissen um die Bit-Operationen wichtig ist oder nicht hängt stark von Deinen Zielen mit der Java-Programmierung zusammen. Willst Du aus eher mathematisch-wissentschaftlichen Gründen programmieren solltest Du Dir das Wissen schon aneignen (z.B. wenn Du Java im Rahmen eines Inf.-Studiums lernst). Willst Du eher eine kleine DB-Anwendung für Deine Filmesammlung o.Ä. haben ist es wohl weniger interessant.
Willst Du Dir einfach Grundlagen für eine mögliche berufliche Basis schaffen solltest Du es Dir mal anschauen, vermerken, dass es solche Möglichkeiten gibt und Dir ansonsten vornehmen es Dir bei Bedarf anzueignen.
 

Landei

Top Contributor
Bitoperationen sind schon nützlich. Man nehme nur den Code, um zu testen, ob eine Zahl eine Zweierpotenz ist:

Java:
public boolean isPowerOfTwo(int i) {
   return i != 0 && (i & (i-1)) == 0;
}

Versucht das mal ohne das & zu schreiben...
 
Zuletzt bearbeitet:

Landei

Top Contributor
Es war absehbar, dass der log nicht genau genug sein konnte, dass das auch für große Zahlen funktioniert (sonst hätte ich mir auch nicht die Mühe gemacht, es zu testen). Von der Performance einmal ganz zu schweigen.

Merke: In der Praxis sieht die Theorie ganz anders aus :p
 
C

chipper

Gast
Bitoperationen sind schon nützlich. Man nehme nur den Code, um zu testen, ob eine Zahl eine Zweierpotenz ist:

Java:
public boolean isPowerOfTwo(int i) {
   return i != 0 && (i & (i-1)) == 0;
}

Versucht das mal ohne das & zu schreiben...
1.Wie soll das gehen, ich verstehe die Überprüfungsvariante nicht so ganz.
Habe mir das jetzt so gedacht: (geht um den teil: (i & (i-1)) == 0) am beispiel von int i = 4;
4 = 0000100 binär
3 = 0000011 binär
mit & operator wird das zu 000, also ist die bedingung wahr, ansonsten gibt es einen i != 0
habe ich das richtig verstanden?
bei den zweierpotenzen steht dann die 1 ja immer an höchster stelle, wenn man nun also von rechts eine /mehrere null(en) einschiebt wird das ergebnis auch null, hast du das so gemeint?
Ich weiß nicht, wie man das genau umsetzt, aber müsste dann doch herausfinden, an welcher stelle die 1 gesetzt ist und dann die enstprechende anzahl an nullen einschieben von rechts, im genannten beispiel von mir also 5 stück.

Ganz schön schwer, hoffentlich stimmt es wenigstens ansatzweise


2. Momentan lerne ich es privat als Grundlage (weil im Informatikkurs in der Schule geht es nicht wirklich voran), habe aber vor in einen Informatikberuf zu gehen, evtl. auch Info studieren.
 
C

chipper

Gast
Korrektur:
"bei den zweierpotenzen steht dann die 1 ja immer an höchster stelle"
ich meinte, es dürfte nur eine 1 vorkommen
 

XHelp

Top Contributor
In dem Beispiel von Landei ist doch überhaupt nicht die Rede von Shift-Operatoren. Deswegen habe ich keine Ahnung worauf die Frage abzielt.
Generell ja: wenn du ohne beachtung an Vorzeichen anfängst in eine Richtung zu schieben, wirst du früher oder später nur Nullen stehen haben. Aber da in Java int 32 Bit lang ist, ist die von dir genannte "5" falsch.

Eine Zweierpotenz ist eine Potenz der Basis 2, quasi 2^x. Meinst du vllt Zweierkomplement?
 
C

chipper

Gast
Was eine Zweierpotenz ist, ist schon klar.
Landei hatte doch geschrieben, dass ich das mal probieren sollte, den genannten Code ohne "&" zu schreiben, das habe ich gemeint.

Das hatte ich vergessen, ich habe erstmal mit byte gemacht, weil das nicht so viele Bits hat.

Wie hat es denn Landei dann gemeint?
 

Landei

Top Contributor
Rhetorisch. Ich meinte eigentlich nur, dass sich das viel einfacher mit Bitoperationen als "konventionell" lösen lässt.

Der Vollständigkeit halber eine Variante ohne Bitoperationen:

Java:
public boolean isPowerOfTwo(int i) {
   while(i % 2 == 0) {
     i /= 2;
   }
   return i == 1;
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
J Listen Operationen Java Basics - Anfänger-Themen 4
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
B Matrizen Operationen Java Basics - Anfänger-Themen 7
S NaN - Operationen ohne Fehler? Java Basics - Anfänger-Themen 3
B AffineTransform - Reihenfolge der Operationen Java Basics - Anfänger-Themen 3
G Messen von Elementaren Operationen Java Basics - Anfänger-Themen 3
S Liste von möglichen Operationen Java Basics - Anfänger-Themen 2
B genaue Anzahl der Operationen in Schleifen Java Basics - Anfänger-Themen 5
Haave Postfix-Rechner: mehrere math. Operationen nacheinander ausführen Java Basics - Anfänger-Themen 8
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
B math. Operationen + Ausgabe Fehler :S Java Basics - Anfänger-Themen 5
K println - Klammern von Operationen Java Basics - Anfänger-Themen 4
O Operationen auf ein Set Java Basics - Anfänger-Themen 3
Q mathematische Operationen als Methode und nicht Infix-Operator Java Basics - Anfänger-Themen 14
X Zählen von arithmetischen Operationen und Vergleichsoperationen Java Basics - Anfänger-Themen 7
R Kommandozeile Operationen Java Basics - Anfänger-Themen 3
G Strings Operationen Java Basics - Anfänger-Themen 7
G String-Operationen Java Basics - Anfänger-Themen 6
F Operationen mit Zeichenketten Java Basics - Anfänger-Themen 8
ven000m Aritmethische Operationen Java Basics - Anfänger-Themen 7
S Stack-Operationen Java Basics - Anfänger-Themen 59
K Verschiebeoperatoren - manchmal falsche Ergebnisse Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben