kostenloser Webspace werbefrei: lima-city


Bit-Operatoren, Mersenne-Zahlen identifizieren

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    demonic-legends

    Kostenloser Webspace von demonic-legends

    demonic-legends hat kostenlosen Webspace.

    Hallo,
    in der aktuellen Übungsaufgabe soll mein Java-Programm u.a. identifizieren ob eine Zahl eine Mersenne-Zahl ist (in Binärform ausschließlich aus 1 bestehend). Dafür dürfen nur Bit-Operatoren genutzt werden.

    Momentan kann ich damit leider noch nicht wirklich etwas anfangen, kann mir da vielleicht jemand einen Denkanstoß bzw. Beispielcode geben?

  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. j*********r

    Ja gut eine Mersenne-Primzahl ist eine Zahl 2^n-1. Dementsprechend besteht sie nur aus 1ern im Binärsystem, das sollte doch als Anhaltspunkt genügen. Um dann noch zu bestimmen, dass es sich auch um eine Primzahl handelt (denn bspw. 2^4-1=16-1=15=3*5 ist keine Primzahl), musst du noch einen Primzahltest durchführen. Da hilft dir aber Google weiter oder du durchsuchst einfach mit einer Schleife nach möglichen Primfaktorzerlegungen - ist halt ggf. weniger effizient.

    mfg
    Jonas

    Beitrag zuletzt geändert: 15.5.2017 22:24:35 von jonas-bayer
  4. Ich weiß zwar nicht was du unter "nur Bitoperationen" verstehst aber:

    invertiere die Eingabe, ist das Ergebnis dann gleich Null enthielt der Eingabewert nur 1en.

    Beitrag zuletzt geändert: 15.5.2017 22:28:48 von fatfox
  5. Autor dieses Themas

    demonic-legends

    Kostenloser Webspace von demonic-legends

    demonic-legends hat kostenlosen Webspace.

    fatfox schrieb:
    Ich weiß zwar nicht was du unter "nur Bitoperationen" verstehst aber:

    invertiere die Eingabe, ist das Ergebnis dann gleich Null enthielt der Eingabewert nur 1en.


    Es geht darum, dass es ja durchaus mehrere Wege gibt diese Aufgabe zu lösen, wir dürfen hier aber nur Bitoperatoren nutzen um das Ergebnis zu erreichen. Der Weg den du da beschrieben hast wird der benötigte sein.

    Ist das denn wirklich einfach so anwendbar?
    byte number = ~7;
    return number == 0;


    Oder kann ich so nicht damit arbeiten?

    Edit: Scheint nicht so einfach zu sein, Zahlen ab 255 wird aufgrund von 1111 1111 -> 0000 0000 und wird damit als true zurück gegeben, für andere Zahlen funktioniert das leider nicht, da vorangestellte 0 zu 1 werden. (0000 0001 -> 1111 1110).

    Edit 2: Konnte die Problemfälle unter 255 jetzt lösen, indem ich immer für den nächsttieferen Schritt eine Abfrage habe um per Left-Shift immer eine Stelle weiter nach links zu schieben. Gibt es eine schönere Variante als für jede Stelle eine einzelne Abfrage zu haben?

    Beitrag zuletzt geändert: 16.5.2017 9:30:07 von demonic-legends
  6. Sind Kontrollstrukturen erlaubt? Dann kannst Du einfach mit

    and 1

    testen und einen Shift machen - das ganze in einer Schlaufe.
  7. Autor dieses Themas

    demonic-legends

    Kostenloser Webspace von demonic-legends

    demonic-legends hat kostenlosen Webspace.

    Moin nochmal,
    Thema ist schon durch, wollte hier für die Nachwelt nochmal die optimale Lösung dalassen:
    public static boolean isMersenne(int number) {
    if (number <= 0) {
    return false;    
    }
    while ((number & 1) == 1 ) {
    number = number >> 1;
    }
    return number == 0;
    }


    Beim ersten Ansatz wäre zu viel Hardcoding aufgrund der Länge der Datentypen nötig, auf diese Weise hier funktioniert der Test unabhängig vom Datentyp.

    Beitrag zuletzt geändert: 21.5.2017 15:11:21 von demonic-legends
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!