Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
4.5
ich hätte eine Frage … oder lassen wir besser sagen … in dieser Aufgabe komme ich gar nichts weiter …
von a schon bekommen ich Schwierigkeiten …
um einen Zahl N in Binärdarstellung braucht man ld N aufgerundet bits , wie kann ich das ohne Math Klasse zu machen …
ich finde keine Idee …!!
werde mich freuen auf Hilfe …
Danke im Voraus
Die Anfrage für Hilfe ist zwar relativ spät für die relativ schwierige Aufgabe, aber du kannst immer deine Frage stellen. Ob du rechtzeitig eine Antwort erhälst, ist eine andere Sache.
kannst du mir vielleicht nur einfach sagen , wie kann man das einfach machen … ?
ohne Math ist gar nicht so einfach .
wie soll man weiter in diese Aufgabe ?
Naja, überleg dir mal eine Lösung mit einer Schleife.
Wenn du das geschafft hast, kannst du dir mal überlegen, wie du die Schleife in eine Rekursion packen kannst.
Ansatz:
Sei f(x) die Funktion, die die Länge der Binärdarstellung der Zahl x berechnet. Also:
f(0) = 1 //Das steht ja im Kommentar der Methode
f(1) = f(1) = 1 //Denn die 1 als Binärzahl ist einfach wieder die 1 und die hat offensichlicht die Länge 1
f(2) = f(10) = 2 //2 als Binärzahl ist 10 und hat somit die Länge 2
f(3) = f(11) = 2 //3 als Binärzahl ist 11 und hat die Länge 2
f(4) = f(100) = 3 //4 als Binärzahl ist 100 und hat die Länge 3
usw.
Jetzt musst du dir überlegen, wie du da Rekursion einbauen kannst. Tipp: Der Shift-Operator ist das A und O in der Aufgabe
Beispiel:
int a = 7; // 7 als Binaer: 111
int b = a<<1; //b hat den Wert 14, binaer: 1110
int c = a<<2; //c hat den Wert 28, binaer: 11100
int d = a>>2; //d hat den Wert 1, binaer: 001, wobei die 00 nur zum Veranschaulichen dastehen
das heisst , dass man von 32 Bit anschauen muss , und einfach schiften bis den Wert von Zahl bekommt ? …
muss ich das irgendwie in Binäre zu erst umwandle ? …
auch mit Schleifen kommen wir nicht zu Lösung …
Was hat das jetzt mit 32 Bit zu tun? Aber ja, man muss shiften bis … das musst du dir überlegen.
Nein, du musst nichts umwandeln. Der Shift-Operator arbeitet implizit auf die Binärdarstellung der Zahl.
Dann überlegt euch mal eine Lösung, wie ihr mithilfe einer Schleife feststellen könnt, wie lang die Binärdarstellung einer Zahl ist (Tipp: sukzessive Division). Zwar ist Rekursion häufig intuitiver, aber viele kämpfen von Natur aus gegen Rekursion …
Ich möchte nur nochmal klarstellen, dass in der Aufgabe keinerlei Schleifen gestattet sind. (Schleife → 0P.)
gaku hat aber natürlich insofern Recht, dass es für manche hilfreich ist, sich die Lösung zuerst mit einer Schleife zu überlegen.
Ansonsten kann man noch einige allgemeine Hinweise zu bitweisen Operatoren und der Aufgabe in den alten Folien (SS2014, S27f), die aus Gründen nicht in den aktuellen Folien gelandet sind…
ich versuch jetzt einen Counter zu benutzenn , und immer bekomme ich einen 1 Folge … heisst das … dass unser int in dieser Methoode ist auch als Binär betrachtet … weil immer wenn ich counter ++ mache , bekomme ich einen extra eins ( zB. 1111111)
ist das jetzt normal ?
Poste mal ein Beispiel.
ich mache eine int count = 0 ;
dann frage ich ob mein num == 0 ist , dann Basisfall
count ++ ; und dann einen Rekursive Aufruf
ich versuch das auszudrücken , dann bekomme ich auf dem Bildschirmm 11111
wenn ich von Anfang an mein count = 1 ; stelle , dann bekomme ich für irgendeinen Grund 22222
( ich habe den Shift benutzt um den Rekursive Aufruf zu machen ) statt durch 2 teilen
Ich vermute mal dein Code sieht in etwa so aus?
int count = 0;
//Basisfall
// ...
count++;
//Rekursiver Aufruf
Dann liegt das Problem gleich in der ersten Zeile, denn count wird in jedem rekusiven Aufruf neu angelegt. Du könntest a) eine private(!) Hilfsmethode verwenden oder b) es ohne Zählervariable machen, das geht auch (Tipp: Was gibt der rekursive Aufruf zurück (für n/2)? Wie bekommst du daraus die Lösung für deine ursprüngliche Eingabe (n)?)
kann es sein das der Testcase ein Fehler enthält?
@Test(timeout=100)
public void mainc() {
int i = WrittenRecursiveMultiplication.extractHigherBits(1, 10);
assertEquals(5, i);
}
(10) = 1010 in binär. Somit als rückgabe nur 0001 somit assertEquals(1,i); ??? vllt hab ich was übersehen?
10 in Binär lautet: 1010
Wenn der Parameter lowerbits = 1 ist, dann verschwindet von rechts ein Bit, also:
1010 => 101 und das entspricht der 5