Hallo MCore, ich komme bei einer Aufgabe nicht mehr weiter und weiß nicht, wie ich es geschickt lösen soll.
Code
Alles anzeigen
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:
Alles anzeigen
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:
und so alle Kombinationen durchgehen. Das wäre aber total umständlich und es geht sicherlich viel eleganter.
oder in einer While Schleife:
Da hab ich aber wieder das selbe Problem, dass ich die Sequenzen mitten drin nicht beachte.
Aufgabe schrieb:
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
Quellcode
- public class Bitoperationen {
- /**
- * Die Methode prüft, ob der Bit an einer bestimmten Position auf 1 gesetzt ist
- * @param bits gibt die Zahl an, bei der die Bits geprüft werden sollen
- * @param bitPosition gibt die Position des Bits an, der geprüft werden soll
- * @return liefert "true", wenn der bit an der Position bitPosition 1 ist. Wenn nicht, liefert return "false"
- */
- static boolean checkIfBitIsSet(int bits, int bitPosition){
- return ((1<<(bitPosition-1)) == (bits & (1<<(bitPosition-1))));
- }
- /**
- * Die Methode soll bei einer ganzen Zahl die Summe aller Bits auf 1 zurückgeben
- * @param bits ist die ganze Zahl, auf die die Methode angewendet wird
- * @return gibt die Summe aller Bits auf 1 aus
- */
- static int countBitsSetToOne(int bits){
- int n=1;
- int sum=0;
- while(n<17){
- if (checkIfBitIsSet(bits,n)==true){
- sum=sum+1;
- }
- else sum=sum;
- n++;
- }
- return sum;
- }
- /**
- * Diese Methode gibt die längste Folge von auf 1 gesetzten Bits als Zahl an
- * @param bits ist die Zahl, auf der die Methode eingesetzt wird
- * @return gibt die Summe aus
- */
- static int countLongestSequenceOfBitsSetToOne(int bits){
- int a=1;
- int b=1;
- int sum=0;
- while(a<17){
- if (checkIfBitIsSet(bits,a)==true){
- while(checkIfBitIsSet(bits,b)==true){
- sum=sum+1;
- b++;
- }
- }
- else ;
- a++;
- }
- return sum;
- }
- public static void main(String[] args) {
- //Aufgabe 4.3 a
- System.out.println("Test von Aufgabe 4.3(a):");
- System.out.println("Beispiel 1: " + checkIfBitIsSet(1, 1));
- System.out.println("Beispiel 2: " + checkIfBitIsSet(2, 1));
- System.out.println("eigenes Beispiel:" +checkIfBitIsSet(8,4));
- //Aufgabe 4.3 b
- System.out.println("Test von Aufgabe 4.3(b):");
- System.out.println("Beispiel 1: " + countBitsSetToOne(1));
- System.out.println("Beispiel 2: " + countBitsSetToOne(3));
- System.out.println("Beispiel 3: " + countBitsSetToOne(17));
- System.out.println("Beispiel 4: " + countBitsSetToOne(21845));
- //Aufgabe 4.3 c
- System.out.println("Test von Aufgabe 4.3(c):");
- System.out.println("Beispiel 1: " + countLongestSequenceOfBitsSetToOne(1));
- System.out.println("Beispiel 2: " + countLongestSequenceOfBitsSetToOne(3));
- System.out.println("Beispiel 3: " + countLongestSequenceOfBitsSetToOne(17));
- System.out.println("Beispiel 4: " + countLongestSequenceOfBitsSetToOne(3309));
- }
- }
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:
Quellcode
- static int countLongestSequenceOfBitsSetToOne(int bits){
- int sum = 0;
- int i = 1;
- int arr[] = new int[17]; // arr ist ein Array mit der Länge 17, da das erste Element eine 0 ist.
- //Die For-schleife legt auf die Bitposition 1-16 auf den arr[i] ein true,
- //wenn an der Position i eine 1 steht.
- for(i; i<arr.length; i++)
- arr[i] = checkIfBitIsSet(bits,i);
- return sum;
- }
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:
und so alle Kombinationen durchgehen. Das wäre aber total umständlich und es geht sicherlich viel eleganter.
oder in einer While Schleife:
Da hab ich aber wieder das selbe Problem, dass ich die Sequenzen mitten drin nicht beachte.