Anfänger braucht Hilfe :)

sha1337

Grünschnabel
Hey Leute! Ich stehe total aufm Schlauch...
Ich mache Momentan spezifische Aufgaben zum erlernen von Java ( ob die Aufgaben Sinn ergeben, oder nicht, sei mal dahingestellt, geht ums Prinzip ). Und zwar hänge ich jetzt an einer Aufgabe, in der geht es um Bitmanipulation.
Die Aufgabe besteht darin, dass ein Nutzer 2 Zahlen eingibt ( x , y ) und aus den beiden Zahlen sollen:

1. Wert des Bit Nummer y von x
2. x um y Positionen nach rechts geschoben
3. x um y Positionen nach links geschoben
4. x mit dem Bit y auf 0 gesetzt.
5. Die Position des höchsten Bits von x, das 1 ist.

BEISPIEL: x = 6, y = 1;

1. Bit 1 von 6 ist 1
2. 6 >> 1 = 3
3. 6 << 1 = 12
4. 6 mit Bit 1 auf 0 = 4
5. Höchstes Bit: 2


2. und 3. könnt ihr streichen, da habe ich einfach System.out.println( x >> y ); ist denk ich die einfachste Methode :D...
Aber wie schaut es mit dem Rest aus? Ehrlich gesagt habe ich 0 Ahnung wie ich da rangehen könnte...
Vielleicht kann mir ja wer helfen :).
LG
 

zerix

Hausmeister
Moderator
Hallo,

soll bei 1. nur 1 oder 0 rauskommen?
Da musst du auf jeden Fall mit & arbeiten und vorher noch eine 1 nach links verschieben, um soviele Stellen, wie du das Bit wissen möchtest. Bei deinem Beispiel:

a = 1<< 1;
b = 6 & a;

Für 4. würde ich 1 um soviele stellen nach wie das Bit, was du auf 0 setzen möchtest. Dann einfach nur subtrahieren.

a = 1<<1;
b = 6 - a;

Für 5. die Zahl nach rechts schieben, solange bis die Zahl 1 ist und einen Zähler hochzählen.

Viele Grüße

Sascha
 

sha1337

Grünschnabel
Hey schonmal vielen Dank für deine Hilfe!
Bei der Ersten kann auch 0 rauskommen...
Könntest du evtl. ein bisschen erläutern, wie du drauf gekommen bist ? Ich glaube ich verstehe gar nicht was man von mir will, dass ist das Problem :/
lg
 

zerix

Hausmeister
Moderator
Bei 1.
Da will man halt wissen, ob das Bit y gesetzt ist. Dein beispiel 6 und 1
Die 6 sieht binär so aus: 0000 0110
Jetzt sollst du halt zeigen, ob das Bit gesetzt ist oder nicht.
Warum ich jetzt 1 um die Stelle verschiebe die du brauchst, ist einfach.

Die 1 sieht binär ja so aus: 0000 0001
Damit würdest du das Bit 2^0 bekommen.

Durch einen links-shift verschiebst du das Bit an die Stelle, die abgefragt werden soll.
1 << 1 = 2^1 = 0000 0010
1 << 2 = 2^2 = 0000 0100
usw.

Bei der &-Verknüpfung fragst du dann genau dieses Bit ab.

0000 0110 (6)
0000 0010 (Bit 2^1 oder 1<<1)
0000 0010 ergibt.

Wäre das Bit nicht gesetzt, würde 0 rauskommen. Kommt 0 raus, ist das Bit nicht gesetzt, kommt ein Wert über 0 raus ist das Bit gesetzt.

Mit etwas überlegen solltest du jetzt wissen, wie ich auf die anderen Lösungsansätze kam.

Viele Grüße

Sascha
 

HonniCilest

Erfahrenes Mitglied
Hallo,

Für 4. würde ich 1 um soviele stellen nach wie das Bit, was du auf 0 setzen möchtest. Dann einfach nur subtrahieren.

a = 1<<1;
b = 6 - a;

Aber nur, wenn das Bit nicht schon 0 ist.

Edit: Um hier die Überprüfung auf 0 zu sparen würde ich einen anderen Operator wählen. Welcher geeignet ist kannst du dir immer anhand einer Wahrheitstabelle überlegen:
1100
1010
____
0100
Sieht das nicht nach einer Negativen Implikation aus? :)

@sha1337: Bist du dir sicher, dass y nicht von rechts nach links gezählt wird?
 
Zuletzt bearbeitet: