Bit-Operatoren, Mersenne-Zahlen identifizieren
lima-city → Forum → Programmiersprachen → Java
anhaltspunkt
anwendbar code
bestimmen
bit
code
eingabe
einzelne abfrage
ergebnis
identifizieren
nachwelt
null
operator
primzahl
programm
schieben
schlaufe
stelle
url
weg
zahl
-
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?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 -
Sind Kontrollstrukturen erlaubt? Dann kannst Du einfach mit
and 1
testen und einen Shift machen - das ganze in einer Schlaufe. -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage