Java: Probleme, Fehler, Fragen

  • Hallo MCore, ich komme bei einer Aufgabe nicht mehr weiter und weiß nicht, wie ich es geschickt lösen soll.

    Zitat von Aufgabe


    Aufgabe 4.3 (C):
    In der vorherigen Aufgabe wurde die Summe aller auf 1 gesetzter Bits gezählt. Für diese Aufgabe sollen sie nun eine Methode static int countLongestSequenceOfBitsSetToOne(int bits) implementieren, welche, die Länge der längsten Folge auf 1 gesetzter Bits, in der Binärdarstellung einer Ganzzahl bits, ermittelt.

    Test:
    Zahl: 3309
    Zahl in Bits: 00001100 11101101
    Ergebnis: 3

    Code

    Meine Überlegung ist folgende:
    Die Methode überprüft, ob an der Stelle a die Methode checkIfBitIsSet(bits, a) ein true liefert. Wenn es true liefert, probiert die Methode es erneut und testen mit der While schleife die nächste Stelle und bricht ab, wenn keine 1 mehr da steht. Sum ist dann die länge der Sequenz, die aus den 1en besteht.
    Mein Problem ist, dass ich so nur die erste Sequenz von Einsen kriege. Es könnte ja sein, dass am Anfang eine 1 steht und in der Mitte eine Sequenz von 3 einsen. Diese Sequenz von 3 Einsen soll ausgegeben werden, es wird aber die erste Eins ausgegeben (siehe "Beispiel 4: "+countLongestSequenceOfBitsSetToOne(3309)).
    Hat jemand eine Idee, wie ich weiter mache und kann mir helfen?

    Ich bin nun auf die Idee gekommen Arrays zu benutzen und die Methode sieht im Moment so aus:


    Nun bin ich stark am überlegen, wie ich die längste Sequenz herrausfinde, wo die Arrays den selben Wert (hier "true") haben.

    Ich kann es natürlich ganz umständlich machen mit:

    Code
    If(arr[1]==arr[2]) return sum=2;


    und so alle Kombinationen durchgehen. Das wäre aber total umständlich und es geht sicherlich viel eleganter.

    oder in einer While Schleife:

    Code
    while(arr[i]==arr[i+1]){
                sum=sum+1;
                i++;
            }

    Da hab ich aber wieder das selbe Problem, dass ich die Sequenzen mitten drin nicht beachte.

  • Ich kenne mich nur bisschen mit AutoIT aus, also nichts großes, aber hab es bissl verstanden, denke ich. ^^

    Kannst du bei der Schleife sobald "false" ausgegeben wird, also sobald es auf die erste 0 stößt, nicht so machen, dass es zur nächsten Zahl überspringt? Hoffe das war halbwegs verständlich ausgedrückt.

  • Ich mache aus einer ganzen Zahl, in diesem Fall 3309 eine Bitzahl und überprüfe jedes einzelne Bit. Wenn du es etwas abänderst, sollte es zu deiner Aufgabenstellung passen. Ergebnis ist, wie von dir oben genannt, natürlich 3.

    Der Code ist allerdings in C++ geschrieben.

    Erklärung zum Code:

    int i = (sizeof(zahl)*8) - 1 ergibt die Anzahl an Bits.
    sizeof(zahl) bzw. eher sizeof(int) (in diesem Fall int, da "zahl" ein Integer ist) ergibt 4.
    4*8 = 32
    32 - 1 = 31. (Da von 0 angefangen also ebenfalls 32 :) )

    Meine Bitzahl wäre also 00000000 00000000 00001100 11101101. Vorne rangestellt sind halt die Nullen, welche aber nicht weiter stören.

    if((zahl & (1 << i)) > 0) überprüft das momentane Bit darauf, ob es > 0, also 1 ist.

    Den Rest kannst du dir ja eigentlich denken, der sollte sofort leserlich und verständlich sein. Ansonsten frag in der Chatbox nach und ich werde es denn, wenn ich es lese, hier editieren. :)

    [SIGPIC][/SIGPIC]

  • Der Teil mit dem "max = cur" könnte man noch optimieren, eigentlich muss man das nur wieder wenn cur auf 0 gesetzt wird und am Ende (falls der Fall nie eintritt) machen.

  • dowhile:
    So ähnlich habe ich es nachher auch geschafft, jedoch stehe ich nun vor ein neues Problem:

    Ich soll eine Methode entwickelt, die bei einer Zahl "int bits" den Binärcode nach einem bestimmten Muster "int bitPattern" überprüft.
    Beispiel:
    bits = 2641
    In Binärcode wäre bits 0000100110011101
    bitPattern = 110

    Man sieht, dass das Muster 110 in 2641 enthalten ist:
    0000100110011101
    Das es hier zweimal drin ist, ist egal - hauptsache es ist drin.

    Mein Problem ist eben, dass die 110 eine Ganzzahl ist. Darum muss ich es irgendwie schaffen int bitPattern (hier 110) in eine andere Ganzzahl zu wandeln, deren Binärcode wie 0...0110 aussieht also am Ende die Zahlenfolge 110 hat. In diesem Beispiel wäre die gesuchte Zahl die Zahl 6.

  • Hi,

    ich hab gar nicht gesehen, dass das Thema schon zwei Tage alt war. :|

    Zitat

    [COLOR=#333333]Mein Problem ist eben, dass die 110 eine Ganzzahl ist. Darum muss ich es irgendwie schaffen int bitPattern (hier 110) in eine andere Ganzzahl zu wandeln, deren Binärcode wie 0...0110 aussieht also am Ende die Zahlenfolge 110 hat. In diesem Beispiel wäre die gesuchte Zahl die Zahl 6.


    Hm, meine erste Idee wäre das:

  • Vielen Dank! Es stimmt auf jedenfall und ich kann es benutzen, muss es nur noch genauer verstehen.
    "res += ((bitPattern % 10 == 1) ? i : 0);" Ist mir unklar
    Kannst du in der ersten Zeile der while Schleife das ":"; "+=" und das "?" erläutern? Das += hab ich schonmal gesehen, wurde aber nur kurz gezeigt, und nicht weiter erläutert/benutzt.

  • "res += ((bitPattern % 10 == 1) ? i : 0)" ist eine If-Bedingung.

    (bitPattern % 10 == 1) = Bedingung
    ?
    i = Wenn Bedingung true
    :
    0 = Wenn Bedingung false

    Heißt:
    Wenn (bitPattern % 10 == 1) wahr ist, wird zu res i hinzugefügt, ansonsten bleibt es unverändert (+ 0).

    [SIGPIC][/SIGPIC]

  • Btw: Hab mal den Thread für kleine Probleme, Fehler oder Fragen bzgl. Java angepasst.


    Hätte eine andere Frage bzw. ein nur kleines Problemchen:

    Der Compiler spuckt folgende Fehler aus:

    Zitat

    AufgabeZwei.java:30: error: unexpected type
    if((numbers[i] <= numbers[i-1])=true){
    ^
    required: variable
    found: value

    Zitat

    AufgabeZwei.java:36: error: unexpected type
    if((numbers[i] >= numbers[i-1])=true){
    ^
    required: variable
    found: value
    2 errors


    In der if Anweisung will ich vergleichen, ob der Array numbers an der Stele i <= bzw >= dem Array davor ist. Sollte doch eigentlich stimmen.

  • Weiß zwar nicht wies in java is aber 1 denke ich muss du das ganze nicht noch mal mit true vergleichen, da die expression ja true oder false zurück liefert und 2. wenn dann mit == und nicht nur = was ja sonst eine zuweisung wäre. So versuchst du dem Ergebnis der expression den wert true zuzuweisen. Daher auch die Meldung das er eine variable und keinen wert braucht.

    Gesendet von meinem GT-I9300

    [CENTER][SIZE=3][FONT=arial]Try to find the [FONT=arial black][SIZE=4]source[/SIZE][/FONT] of your power and [FONT=arial black][SIZE=4]release[/SIZE][/FONT] it![/FONT][/SIZE][/CENTER]

  • Omg, ich habe heute nochmal drübergeschaut und natürlich muss in der If Anweisung kein True. Es funktioniert ja genau dann, wenn es true liefert und das macht ja <=... Da frag ich mich echt, was ich gestern getan habe. Das ist ja fast schon peinlich.

  • Solche Fehler macht jeder mal, davon nicht unterkriegen lassen. Das sind übrigens auch die simplen Fehler, an denen man so lange sitzt, um sie zu beheben. :D

    EDIT: Du kannst natürlich, wie ihr beiden oben geschrieben habt, das true weglassen. Falls du es aus Gründen der Codelesbarkeit trotzdem machen willst, musst du == true abfragen, und nicht = true. Ist aber veraltet und sinnlos, da du sonst im Normalfall true == true bzw. false == true abfragst, und true ist auch true, ohne das abgefragt wird, ob true = true ist. *eine dunkle Wand an Verwirrung macht sich breit* :D

    [SIGPIC][/SIGPIC]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!