Boolescher Wahrheitswert

strohkolben

Mitglied
Ich sitze hier an einer Programmieraufgabe und komme dort nicht wirklich weiter. Die erste Teilaufgabe (Screenshot 1) habe ich bereits erfolgreich geschafft (Screenshot 2). Nun soll der Code erweitert werden (Screenshot 3), hier verstehe ich allerdings gar nichts mehr. Über Hilfe würde ich mich sehr freuen.
LG
 

Anhänge

  • Screenshot 1.png
    Screenshot 1.png
    244,4 KB · Aufrufe: 80
  • Screenshot 2.png
    Screenshot 2.png
    321,1 KB · Aufrufe: 72
  • Screenshot 3.png
    Screenshot 3.png
    149,5 KB · Aufrufe: 76

Neumi5694

Top Contributor
Wenn du rauskriegen willst, ob ein Wert in Binärform an einer bestimmten Stelle eine 1 oder 0 stehen hat, wendest du eine Maske der Form 2^n auf ihn an.
Das Ergebnis der Operation ist 0, wenn der Wert dort eine 0 stehen hat und 2^n, falls dort eine 1 steht.
Wende also die Maske auf deinen Seed an und prüfe, ob der Wert ungleich 0 ist.
 

strohkolben

Mitglied
Wenn du rauskriegen willst, ob ein Wert in Binärform an einer bestimmten Stelle eine 1 oder 0 stehen hat, wendest du eine Maske der Form 2^n auf ihn an.
Das Ergebnis der Operation ist 0, wenn der Wert dort eine 0 stehen hat und 2^n, falls dort eine 1 steht.
Wende also die Maske auf deinen Seed an und prüfe, ob der Wert ungleich 0 ist.
Erstmal danke für deine Antwort, bei mir hapert es allerdings schon beim Verständnis der Aufgabe. Im Falle einer Eingabe von 123 bool wird der Seed berechnet, dieser lautet für 123: 1218640798. Das wäre in Binär: 1001000101000101111101110011110. Das höchstwertige Bit ist ja das Bit was ganz am Anfang steht, in diesem Fall steht ja hier eine 1. Im Falle einer 1 soll aber true ausgegeben werden, die Ausgabe lautet aber false (Screenshot 3). Wo ist hier mein Verständnisfehler?
 
K

kneitzel

Gast
Erstmal danke für deine Antwort, bei mir hapert es allerdings schon beim Verständnis der Aufgabe. Im Falle einer Eingabe von 123 bool wird der Seed berechnet, dieser lautet für 123: 1218640798. Das wäre in Binär: 1001000101000101111101110011110. Das höchstwertige Bit ist ja das Bit was ganz am Anfang steht, in diesem Fall steht ja hier eine 1. Im Falle einer 1 soll aber true ausgegeben werden, die Ausgabe lautet aber false (Screenshot 3). Wo ist hier mein Verständnisfehler?
Das Problem ist, dass Du mit int Werten rechnest! Dadurch macht diese Berechnung so schlicht keinen Sinn, da Du den int Bereich ja verlässt.

Math.pow(2,32) ist was für ein Wert?

Aus meiner Sicht ist es fast Zufall, dass eben das gleiche Ergebnis raus kommt. Aber Du nimmst dann das falsche Bit als höchstes Bit. Das ist eben nicht das Bit an Stelle 30.
 

strohkolben

Mitglied
Das Problem ist, dass Du mit int Werten rechnest! Dadurch macht diese Berechnung so schlicht keinen Sinn, da Du den int Bereich ja verlässt.

Math.pow(2,32) ist was für ein Wert?

Aus meiner Sicht ist es fast Zufall, dass eben das gleiche Ergebnis raus kommt. Aber Du nimmst dann das falsche Bit als höchstes Bit. Das ist eben nicht das Bit an Stelle 30.
Danke für die Antwort. Jetzt verstehe ich aber gar nichts mehr:D
 
K

kneitzel

Gast
Genau, rechne also mit long Werten.

Und wenn Du Modulo 2 hoch 32 rechnest, dann weisst Du ja, was das höchste Bit ist ...
 
K

kneitzel

Gast
Machen wir ein Beispiel:
Wir nehmen ein Byte (8 Bit), Das erste ist das Vorzeichen Bit, dann bleiben 7 Bit.

Aber nun rechnen wir Modulo 16 (2^4) d.h. das Ergebnis ist von 0 .. 15 - also in den ersten 4 Bit. Damit ist dann das höchste Bit des Ergebnisses nicht das 7te Bit (das wäre das höchste Bit wenn wir den ganzen Bereich ausschöpfen würden) sondern das 4te Bit (das 7te Bit wäre ja immer 0)

Gezählt sind die Bits nach Wertigkeit: n-tes Bit ist das mit der Wertigkeit 2^(n-1)
 

strohkolben

Mitglied
Machen wir ein Beispiel:
Wir nehmen ein Byte (8 Bit), Das erste ist das Vorzeichen Bit, dann bleiben 7 Bit.

Aber nun rechnen wir Modulo 16 (2^4) d.h. das Ergebnis ist von 0 .. 15 - also in den ersten 4 Bit. Damit ist dann das höchste Bit des Ergebnisses nicht das 7te Bit (das wäre das höchste Bit wenn wir den ganzen Bereich ausschöpfen würden) sondern das 4te Bit (das 7te Bit wäre ja immer 0)

Gezählt sind die Bits nach Wertigkeit: n-tes Bit ist das mit der Wertigkeit 2^(n-1)
Kneitzel vielen Dank für die Antworten, freut mich wirklich sehr. Ich bin noch im ersten Semester und stehe bei dieser Aufgabe wirklich auf dem Schlauch. Wie kann ich das denn jetzt konkret auf meine Aufgabe anwenden? Meine Idee war es, den zuvor berechneten Seed in eine Binärzahl umzuwandeln und die Bits in einem Array zu speichern. Ich war der Meinung, dass dass Array an der Stelle [anzahlstellen-1] das Bit mit der höchsten Wertigkeit beherbergt und ich mit zwei simplen IF-Abfragen nun herausfinde ob dort eine 1 oder eine 0 steht. Ich bin aber wohl auf dem Holzweg unterwegs, an dieser Stelle sitzt ja schließlich immer eine 1 und so macht das mit dem Zufallsgenerator ja keinen Sinn....

Schönen Abend und gutes Wochenende noch !;)
Bildschirmfoto 2021-05-28 um 17.19.12.png
 

temi

Top Contributor
Um zu Prüfen, ob ein bestimmtes Bit gesetzt ist, reicht eine logische UND-Verknüpfung aus, z. B. mit vier Bit.

Du möchtest wissen ob das dritte Bit gesetzt ist:

0101 die zu prüfende Zahl
0100 Prüfmaske
0100 Ergebnis der UND Verknüpfung, der entstandene Wert ist nicht 0

1001 die zu prüfende Zahl
0100 Prüfmaske
0000 Ergebnis der UND Verknüpfung, der Wert ist 0
 
K

kneitzel

Gast
Also Du hast ja ein
long m = Math.pow(2,x)?
und rechnest dann eine Zahl modulo m.

In welchem Bereich ist diese Zahl dann?

Nehmen wir einfach einmal ein paar x her und schauen, was
- da dann m für ein Wert hat
- in welchem Bereich z % m (mit z einer beliebigen Zahl) ist
- wie der größte Wert von z % m aussieht

Einfach mal als Tabelle
Code:
x    m            z%m        max(z%m) binär
0    2^0 = 1        0        0
1    2^1 = 2        0..1    1
2    2^2 = 4        0..3    11
3   2^3 = 8        0..7    111
4   2^4    = 16    0..15    1111

n    2^n            0..(n-1)    1111...1 (n 1er)

Damit ist dann doch klar, welches die höchste, mögliche Ziffer ist bei einer z%m Rechnung, so m = Math.pow(2,x) ist, oder?

Den Ansatz könnte sogar gehen. Du bestimmst in der ersten Schleife, wie viele Stellen die Ziffer hat oder an welcher stelle die letzte 1 steckt. Das könntest Du mit x vergleichen ...

Ansonsten ist dir aber auch eine andere Möglichkeit genannt worden: binäres und:

Nehmen wir den Fall x = 4. Die größte Zahl ist also 1111. Generell interessiert und aber nun die erste der 4 Ziffern.
Das wäre also ein dann ein Ergebnis & 1000. Wenn da 1000 raus kommt, dann ist die erste Ziffer eine 1 und wenn da 0000 raus kommt, dann ist die erste Ziffer eine 0.
Wie kommen wir denn auf das 1000? Das ist in dezimal ja die 8 -> 2^3. Bei 2^4 ist also 2^3 der Wert, den wir da benötigen ... Den können wir auf diversen Wegen bekommen:
- Math.pow(2,x-1)
- m/2
- m >> 1 (Um 1 Bit verschieben ist auch ein /2)
- ...

Das ist noch einmal die Erläuterung von dem, was dahinter steckt. Der wichtige Punkt ist vermutlich, dass Du die modulo Operation verstehst.
 
K

kneitzel

Gast
Mal ne blöde Frage, aber in der Aufgabe (Screenshot 1) steht doch der Datentyp soll uint sein. Unterstellen wir int als 32 Bit-Zahl, dann ist doch von vornherein klar, welches das höchstwertige Bit ist.
Ich sehe das problematisch. Es gibt kein uint in Java. Und dann ist unklar, dass ein uint 4Byte hat. eine typische Sprache mit unsigned integer ist z.B. C / C++ und auf einem 64Bit System kann das durchaus dann ein 8Byte (64Bit) Wert sein.

Wenn man mit uint rechnet, dann macht diese Aufgabe so aber auch keinen Sinn, denn 2^32 passt in ein 4byte uint nicht rein. Der größte Wert wäre 2^32 -1

Die Bedeutung von "Höchstem Bit des neu berechneten Seeds" müsste man auch genau betrachten. (Hier ist es egal - beide Auslegungen führen zu genau dem gleichen Bit). Wenn ich den Seed mit dem Modulo von 2^8 berechnen würde, dann hätte ich ja nur 8 Bit. Was ist dann das höchste Bit des berechneten Seeds? Der vom Datentyp (uint -> also das 32te Bit) oder der aus der Berechnung mögliche Werte? Ich selbst achte mehr auf den Wert - und dann wäre der Seed ein Wert aus der Menge von 00000000 bis 11111111 - und da ist es mit egal, in welchem Datentyp es genau gespeichert wird.

Das mag durchaus als falsch angesehen werden.

Aber aus den genanten Gründen fand ich die Aufgabe etwas unglücklich gestellt und das war auch der Grund, dass ich da geschaut habe, wie ich da etwas mehr Sinn rein bekommen könnte. Und da fand ich Vorgehen mit dem Modulo-Operator mit Divisor (Heisst der zweite Operand bei Modulo auch Divisor?) von 2^x eine interessante Ausgangsbasis.

Aber ob das Sinn macht oder nicht ... oder im Zusammenhang mit dieser Aufgabe sinnvoll ist: Das kann ich nur schwer beurteilen. Meine Zeiten an Schule und Uni sind zu lange vorbei und da sind dann ggf. mehr Personen gefragt, die ggf. sogar an Hochschulen lehren. Die zerbrechen sich da deutlich mehr über sowas den Kopf (wobei an Unis ja diesbezüglich wenig in der Richtung an Ausbildung voraus gesetzt wird. Da wären dann ggf. Lehrer bessere Experten...)
 

temi

Top Contributor
Ich sehe das problematisch. Es gibt kein uint in Java.
Das ist zwar korrekt, aber ich nehme an, dass gemeint ist, einfach den 32-Bit-Interger als unsigned zu betrachten, also das höchstwertigste Bit nicht als Vorzeichenbit zu sehen.

Was wird also gemacht: Der errechnete, möglicherweise größere Wert wird durch die Modulo-Rechnung auf 32 Bit "gestutzt" und man muss für die Aufgabe einfach nur das höchstwertigste Bit anschauen, nämlich das 32te.

Steht auch so in der Aufgabe. Die Modulo-Operation kann durch ein wortweises UND mit 2^n - 1 ersetzt werden. Nehmen wir für n mal 8 anstatt 32:

2^8 = 256 = 1 000 000
256 - 1 = 255 = 1111 1111

In der Maske sind alle 8 Bit gesetzt. Durch ein wortweises UND ergibt sich am Ende ein Wert, der maximal 8 Bit ausnutzen kann.

Bei n = 32 würde sich ein Wert ergeben, der maximal 32 Bit ausnutzen kann. Passt für mich.
 
K

kneitzel

Gast
Ja, man kann vieles da rein interpretieren.
ich nehme an, dass gemeint ist, einfach den 32-Bit-Interger als unsigned zu betrachten, also das höchstwertigste Bit nicht als Vorzeichenbit zu sehen.
Und genau das macht keinen Sinn, denn man kann einen int Wert nicht entsprechend so nehmen.

Wenn es uint gäbe, dann bräuchte man übrigens auch kein Modulo sondern würde nur ein a * b + c rechnen - Der Typ schneidet dann automatisch ab.

Was wird also gemacht: Der errechnete, möglicherweise größere Wert wird durch die Modulo-Rechnung auf 32 Bit "gestutzt" und man muss für die Aufgabe einfach nur das höchstwertigste Bit anschauen, nämlich das 32te
Und nichts anderes schreibe ich doch auch die ganze Zeit - mit dem Unterschied, dass ich es auf beliebiger Anzahl Bits machen möchte. (Du greifst dann ja auch zu 8 Bits ...)

Wie man das auch immer alles meint lesen zu wollen: Im Java Umfeld ist die Aufgabe extrem bescheiden. (Im C/C++ Umfeld ebenso, aber das ist ein anderes Thema). Und man sollte, wenn man ein Programm schreibt, die eigentliche Thematik (Die "Problem Domain") verstanden haben...
 

temi

Top Contributor
Ist ja im Prinzip egal und ich möchte deswegen auch nicht lang diskutieren. Die Aufgabe ist nicht ganz eindeutig gestellt, da sind wir uns einig.

Und nichts anderes schreibe ich doch auch die ganze Zeit - mit dem Unterschied, dass ich es auf beliebiger Anzahl Bits machen möchte.

Welche beliebige Anzahl an Bits? Du musst dich doch auf ein bestimmtes Bit festlegen und auf welcher Basis möchtest du das tun? Du kannst dir ja nicht irgendein Bit aussuchen, dass dir gefällt. Also musst du dich in der Aufgabe auf irgend etwas festlegen.

Die Aufgabe sagt, dass der Typ uint entsprechen soll. Da wir hier im Java-Umfeld sind, würde ich alle anderen Sprachen und Konzepte mal weglassen oder möchtest du auch über QBits sprechen? Damit ist uint das was es aussagt: ein 32 Bit Integer ohne Vorzeichen. Um den in Java darstellen zu können muss er halt in ein long, soll es so sein. Von dem long werden dann nur die ersten 32 Bit benutzt und sind damit ohne Vorzeichen.
 
K

kneitzel

Gast
Also ich habe es in #15 und #17 doch eigentlich relativ deutlich geschrieben - daher verstehe ich die Nachfrage nicht bezüglich
Welche beliebige Anzahl an Bits?

Die Anzahl der Bits ist ja vorgegeben, da das k bei 2^k ja festgelegt wurde auf 32 => Eindeutig. (Maximal das m = 2^32 sein soll - wenn man die Java Umgebung voraussetzt, dann wäre das ja 34 ( = 2 xor 32) .... ).

Und nein, uint ist und bleibt nicht eindeutig. Das vom Java int abzuleiten wäre denkbar, aber das ist schlicht eine Annahme. Die Aussage mit dem m = 2^32 ist relativ eindeutig. (Ok, im Java Umfeld wird man das als 34 Auswerten wollen, aber in den Erläuterungen findet sich dann ja das 2 hoch k richtig geschrieben und in der Beispiel Rechnung wurde 2^32 als Zahl ausgerechnet und verwendet.

Generell ist es hier egal, über welchen Weg Du auf das 32te Bit kommst - Mehrere Wege wurden vorgestellt (#17), daher ist es mir egal. In #17 habe ich es Dir doch zugestanden, dass Du das auch gerne vom uint hättest ableiten können (auch wenn es in meinen Augen eben nicht so eindeutig ist!)
 

temi

Top Contributor
Dann sind wir uns ja einig. Schönen Sonntag noch, ich geh jetzt raus, zum Wandern und nehm mir unterwegs noch ne Bratwurst mit.
 

strohkolben

Mitglied
So, danke vielmals für die Hilfe, ich konnte die Aufgabe jetzt erfolgreich lösen!
Noch eine Frage: Die Aufgabe besteht aus mehreren Teilaufgaben, jetzt wurde die nächste Teilaufgabe freigeschaltet.
Die Berechnung von int max und int min max habe ich problemlos geschafft, hier sind ja auch Formeln dazu angegeben. Für int ist für die Berechnung ja keine Formel angegeben. Ich habe es mit der Random Klasse versucht um mir damit einen zufälligen Int-Wert ausgeben zu lassen. Die Einreichung wurde dann aber nicht angenommen, eben genau wegen der int Funktion. int max und int min max funktionierten wie erwartet.
Habt ihr eine Idee, wie ich hier auf den erwarteten Wert komme? In der Aufgabe steht ja, dass der seed in int umgewandelt werden soll. Was ist damit gemeint?
Bildschirmfoto 2021-05-30 um 14.34.00.png

Bildschirmfoto 2021-05-30 um 14.40.12.pngBildschirmfoto 2021-05-30 um 14.40.18.png
 

Barista

Top Contributor
Habt ihr eine Idee, wie ich hier auf den erwarteten Wert komme? In der Aufgabe steht ja, dass der seed in int umgewandelt werden soll. Was ist damit gemeint?
Keine Ahnung wie man etwas bei dieser Aufgabenstellung lernen soll.

Eventuell besteht das Ziel darin, dass man lernt aus dem wilden Gebrabel von sogenannten Fachexperten eine sinnvolle Information zu extrahieren.

Ich würde sagen, man soll den Parameter einfach umbenennen, wobei int kein erlaubter Bezeichner ist.
 

Meniskusschaden

Top Contributor
Keine Ahnung wie man etwas bei dieser Aufgabenstellung lernen soll.
Ich werde das Gefühl nicht los, dass wir entweder Teile der Aufgabenstellung nicht kennen, oder dass uns zu viel Kontext fehlt, der sich möglicherweise aus dem Kursstoff ergibt. Zum Beispiel könnte man anzweifeln, ob es überhaupt um Java geht. Für den Datentyp uint hat @temi zwar eine mögliche Interpretation geliefert, andererseits ist schon verdächtig, dass in den Screenshots immer ein exe-File gestartet wird. Außerdem gibt es im ersten Screenshot des Eröffnungspostings einen Verweis auf das Buch Numerical Recipes das zwar für mehrere Programmiersprachen verfügbar ist, aber wohl eben nicht für Java. Das alles schließt zwar nicht aus, dass es hier um Java geht, aber man wüsste schon gerne Genaueres.
Ich würde sagen, man soll den Parameter einfach umbenennen, wobei int kein erlaubter Bezeichner ist.
Ich glaube, mit int ist da nicht der Datentyp des Parameters gemeint, sondern die Zeichenfolge "int", die der Aufrufer als Abgrenzung zu "bool" übergeben kann. An der Stelle wäre eigentlich eine typographische Unterscheidung zwischen int einerseits und min max andererseits sinnvoll gewesen.
 
K

kneitzel

Gast
Also das Problem ist doch hier, dass Java keine optionalen Methoden-Parameter kennt.
Wo siehst Du da hier ein Problem? Es geht um zwei einfache Methoden und die kann man ganz problemlos schreiben. Und die erste Methode kann die zweite mit min=0 aufrufen, so dass ich da nicht wirklich ein Problem sehe.

Ich weiss jetzt im Augenblick auch nicht, wo das Problem vom TE ist.
Für int ist für die Berechnung ja keine Formel angegeben.
Da brauchst Du doch auch keine Formel oder so. Ein Wert soll als Integer, also als Ganzzahl im Bereich des Integers angegeben werden. Also könnte an einfach das bisherige Ergebnis zu einem int casten. Da ist also nichts groß zu berechnen. Da reicht dann etwas wie:

int intSeed = (int) seed; // mit seed der bisher berechnete seed.

Schau Dir bitte im Detail die Datentype an! Zu den Java Grundlagen gehört nun einmal, dass man die grundlegenden Datentypen kennt. Dazu gehört dann halt, dass man weiss, dass ein int in Java mit 4 Bytes (32 Bit) gespeichert wird und das höchste bit das Vorzeichenbit ist.
Da wir den Seed in der bisherigen Berechnung mit 32 Bit berechnet haben, werden wir uns bei dem cast somit vom höchsten Bit verabschieden.
 

Ähnliche Java Themen

Neue Themen


Oben