ich muss eine Aufgabe lösen in der ich ein übergebenes binär Array mit Hilfe des Hornerschemas in eine int Zahl umwandele.
ich hab mir das Hörnerschema schon gefühlt 100 mal auf Papier aufgezeichnet, komme aber irgendwie nicht dahinter wie ich die einträge in meinem Array miteinander addieren bzw multiplizieren muss.
Stehen die Most Significant Bits am Anfang oder am Ende deines Arrays? (Ich gehe mal davon aus, dass das MSB in number[0] steht, sodass f der Dezimalzahl 32 entspricht(?)).
Musst du in der Zeile horner += number * 2; die Nummer mit einer entsprechenden Zweierpotenz und nicht mit 2 multiplizieren.
Was erwartest du dir von der Zeile horner *= horner;?
Die Berechnung innerhalb der for-Schleife beruht wohl darauf:
Die Zahl 1001 würde sich so in eine dezimale Zahl umformen lassen:
1*2^3 + 0*2^2 + 0*2^1 + 1*2^0,
das ist aber genau das gleiche wie:
(((((1*2)+0)*2)+0)*2)+1. Und auf dieser Tatsache beruht wohl die ganze Methode.
Allerdings ist die richtige Klammersetzung im Quellcode nicht umgesetzt worden.
Was du jetzt machst ist:
Java:
horner=horner+(number[i]*2);
was du aber machen willst ist:
Java:
horner=(horner+number[i])*2;
Wie du mit dem niederwertigsten Bit umgehst solltest du dir dann auch nochmal angucken.
Für mich sieht es mit seiner for-Schleife eher so aus, als wöllte er es nicht so klammern, wie du es ausgeführt hast. Falls das aber der Fall ist, sollte er mit deinen Tipps jetzt was anfangen können
ahh natürlich jetzt wird mir einiges klar das mit den Klammern hab ich genau so machen wollen
ok also ich habe jetzt den Code geändert. Jetzt kommt als Lösung 64 heraus, was 1 schleifendurchlauf zu viel ist. müsste an meinem startwert liegen oder ?
mein MSB ist das erste bit, wenn es 1 wäre hab ich schon die passende Methode bereit um es zu konvertieren
publicstaticintbinaryToInteger(int[] number){int horner =0;boolean a =(number[0]==1);for(int i =0; i < number.length-1; i++){
horner =(horner + number[i])*2;}if(a){
number =convertToTwosComplement(number);}
horner=horner+number[7];return horner;
ne, also bei mir funktioniert es perfekt, dafür habe ich jetzt ein ganz anderes Problem,
in der nächsten Nummer habe ich ein binäres Array. dieses soll ich jetzt um ein anderes binäres array der selben Länge nach Rechts stiften. Problem an der Sache ist, dass ich die beiden array nicht in dezimal Schreibweise umformen darf. Push also da hab ich jetzt keine Ahnung wie ich ansetzten soll.
ich hoffe ihr könnt mir helfen.
eventuell muss man den Betreff des Themas ändern, bin nur noch ziemlich neu , deshalb weiß ich nicht wie das geht
Diese arrays enthalten 0en oder 1en und du darfst aber deine eigene binaryToInteger nicht verwenden um z.B. die die Anzahl der shifts die in array2 stehen zu ermitteln ??
@Xelsarion da hilft ihm dein Link glaube ich nicht weiter ?!
Hmm, binaryToInteger hättest du ja selbst geschrieben aber das gilt hier wohl nicht
Aber ich glaube letzten Endes wirst du das zweite Array in eine Dezimalzahl umwandeln müssen, auch wenn es vielleicht eher implizit geschieht. Du könntest z.B. im zweiten Array nachsehen ob das n.te Bit gesetzt ist und dann shiftest du um 2^n nach rechts. Und das ganze machst du in einer Schleife über alle elemente des Arrays.
Damit hast du das zweite array nicht explizit in eine Integerzahl umgewandelt.
ja da hast du recht, anders würde es glaube ich nicht gehen, wenn ich jetzt mal einfach mein array umwandele dann müsste es doch eigentlich so gehen oder?
kriege als Lösung immer 00000000 heraus, egal wie ich stifte
public static int[] shiftRight (int[] input, int[]numberOfentries) {
int [] arrayshifted= new int [numberOfbits];
int shiftnumber= binaryToInteger(numberOfentries);
for (int i=0 ; i<arrayshifted.length ; i++) {
arrayshifted[i+shiftnumber]=input[i];
}
return arrayshifted;
}
sieht eigentlich richtig aus. Hast du dir mal mit dem Debugger oder per println die relevanten Daten
in dieser Methode angeschaut ? shiftnumber, und den Inhalt von input ? numberOfbits ist eine Konstante die sinnvoll belegt ist ?
Edit: ich sehe gerade, ist die Schleifenbedingung denn richtig ? Du darfst ja nicht das ganze array durchlaufen sonst kriegst du irgendwann eine IndexOutOfBoundsException an dieser Stelle: arrayshifted[i+shiftnumber]
hmm also die eingegebenen Daten müssten stimmen. numberOfbits ist immer 8 und die shiftnumber stimmt auch. Das mit der Schleife kann sein, aber er gibt ja auch keine Fehlermeldung aus, nur die Lösung 00000000,
der Fehler liegt aber bestimmt an der Schleife
Ich habe es gerade bei mir ausprobiert. Diese Methode funktioniert wenn du das mit der Schleife korrigierst und wenn du sie mit vernünftigen Daten aufrufst !!
Ok, ich teste es mal schreib dann ob es funktioniert hat. Das mit der Schleife müsste dann ja jetzt so klappen, könne ja keine nicht definierten Werte rauskommen.
ja genial, jetzt klappt alles, es werden richtige Ergebnisse ausgegeben, lag dann nur an dem Schleifendurchlauf . Danke für die ausführliche Antworten.
Ok, schön. Und falls nicht ist es weiter kein Beinbruch. Dann brauchst du nur eine weitere Schleife in der du nachschaust ob in numberOfEntries das n.te Bit gesetzt ist und dann shiftest du um 2^n nach rechts. Den Teil hast du ja schon.