Hello, Guest the thread was viewed2.4k times and contains 58 replies

last post from 64erGrufti at the

Buch for Basic to Oneliners Verständnisfrage

  • Hallo Forum,


    Achtung Anfängerfrage:


    ich habe mir gerade das Buch 'von Basic to One-liners' von Holger Westling gekauft. Sehr genial finde ich.


    Stoße gleich am Einfang auf eine vermutlich Anfängerfrage.


    Es geht um eine boolesche Anwendung von AND und OR.


    Ich verstehe die Berechnung nicht von dem Satz: 'Danach habe ich den Wert von 53265 gePEEKt und erhielt 27.' Soweit alles klar.

    'Dann habe ich aus 27AND240OR7 =23 erhalten'. Hier verstehe ich die Berechnung nicht. Ist vermutlich ganz einfach aber habe ein Brett vorm Kopf.;(


    Danke für Eure Hilfe.


    Frohes WE.

  • 'Dann habe ich aus 27AND240OR7 =23 erhalten'. Hier verstehe ich die Berechnung nicht.

    Zuerst einmal, für AND und OR sollte man sich die Zahlen als (achtstellige) Binärzahlen ansehen; dein Ausdruck ist also 00011011 AND 11110000 OR 00000111 (das kann man so in BASIC nicht angeben, aber für das Verständnis ist was wichtig).


    Zuerst kommt der AND-Operator, der schaut bei jedem Bit, ob bei beiden Zahlen dieses Bit gesetzt ist, wenn ja, wird das Bit im Ergebnis gesetzt, sonst nicht. 00011011 AND 11110000 ergibt somit 00010000.


    Beim OR ist es umgekehrt, da wird das Bit gesetzt, wenn mindestens eines der beiden Bits in den beiden Zahlen gesetzt ist, sonst nicht. 00010000 OR 00000111 ergibt somit 00010111.


    Und diese Zahl kann man jetzt wieder zurück ins Dezimalsystem umrechnen, das ergibt dann 23.

  • Was das Binärsystem betrifft, gibt es 10 verschiedene Gruppen von Menschen: jene, die es verstehen und solche, die das nicht tun. :Peace (ja, ich weiß, der ist alt)

    Zum Programmieren sollte man am besten aber auch noch das Hexadezimalsystem aus der 255 beherrschen. ;) (der ist aber neu *g*)


    Boolesche Algebra kann ziemlich kompliziert werden, aber die binäre Verknüpfung mit AND, OR und NOT, oder wenn man hat, auch noch XOR bzw. EOR, ist eigentlich ganz einfach. Auch, wenn es länger dauert, sollte man theoretisch in der Lage sein, 8-bittige Verknüpfungen im Kopf zu lösen. Bei bestimmten Zahlen geht es im Kopf sogar schneller. Also für 192 AND 128 oder 4 OR 2 bemühe ich nicht erst den Computer.


    Zudem muss man die Rangordnung beachten. Wenn man 7 OR 27 AND 240 in derselben Reihenfolge wie 27 AND 240 OR 7 berechnet, kommt 16 heraus und nicht 23. Wenn man diese Reihenfolge will, muss man (7 OR 27) AND 240 schreiben, denn sonst hat das AND Vorrang und es kommt dasselbe heraus wie zuvor, also 23. Über AND steht wiederum NOT, und noch ranghöher sind Vergleiche und mathematische Operatoren.


    Am wichtigsten ist die Kenntnis von der Rangordnung natürlich, damit der Code genau das macht, was man möchte. Mit Bezug auf Dein Buch: Auch, wenn geklammerte Operationen oftmals einfacher zu lesen sind, hat das Weglassen von überflüssigen Klammern zwei Vorteile: Spart Zeichen und erhöht die Ausführungsgeschwindigkeit. Ich mache das im C64-Studio gern so, dass ich die Rangordnung durch Gruppierung und Leerzeichen darstelle; dann lässt es sich genauso gut lesen. Hier ein Beispiel:


  • Ich hänge gerade an Übung2 letzter Abschnitt. Lösung2 kann ich mir zumindest prinzipiell vorstellen, obwohl ich derzeit auch noch keine Lösung habe. Aber für die beiden anderen Lösungen fällt mir nichts ein.

    Mit einem ON GOTO kann ich in einem Einzeiler ja nur an den Anfang der aktuellen Zeile springen. Ich habe aber keine Idee, wie ich damit erreichen soll, dass di Zeichen 1x ausgegeben werden und anschließend der Rest. Zumindest nicht, ohne die Reihenfolge zu ändern. Auch bei Lösung3 müsste ich ja eine IF-Abfrage machen. Aber IF scheidet ja aus, wie da schon steht.

  • Lösungsvorschlag1 wäre mit ON GOTO

    Lösungsvorschlag2 mit einer Zählvariable

    Lösungsvorschlag3 die Schleife zum Bildschirm füllen nach hinten schieben


    Nachtrag:

    Für Lösungsvorschlag3 habe ich zwar prinzipiell eine Lösung, aber die ist zu lang, damit man sie anschließend noch am C64 eintippen könnte. Und das ist Bedingung.

    Code
    1. 0A=53265:FORL=.TO7:POKEA,(PEEK(A)AND240)OR7-L:POKEA+5,L:NEXT:ONN-2023AND255GOTO:FORN=4^5TO2023:POKEN,123:NEXT:GOTO
  • Post by berni ().

    This post was deleted by Dcobain: Auf eigenen Wunsch gelöscht. Doppelpost ().
  • Noch besser: ON-(N>0)GOTO

    Danke. Das "-" scheint da der Knackpunkt zu sein. Sowas in der Art hatte ich nämlich auch schon probiert, aber immer einen illegal quantity erhalten. Allerdings löst das die Aufgabe leider noch nicht. Eigentlich ist diese ganze ON GOTO schon zu viel. Irgendwo müsste noch mächtig gekürzt werden.

  • Das "-" scheint da der Knackpunkt zu sein.

    Ja Vergleiche liefern 0 oder -1, aber bei ON...GOTO darf der Wert nie negativ sein.


    Man könnte natürlich (PEEK(53265)AND240) durch 16 ersetzen. Im Standard-Bildschirmmodus kommt das da nämlich immer raus; dann verkürzt sich der POKE zu POKE53265,23-L; das ist wesentlich kürzer. Ich bin mir aber nicht sicher, ob das das ist, was gesucht wird.

  • Ich hätte was, weiß aber nicht, ob das jetzt Lösung 1, 2, 3 oder ganz was anderes ist; und ob es überhaupt als Lösung zählt:

    Code
    1. 0forl=4^5to2023-a:pokel,123:next:a=53265:forl=.to7:pokea,(peek(a)and240)or7-l:pokea+5,l:next:goto

    Das ist echt ne geniale Lösung. Ja, die funktioniert tatsächlich. Bei der Eingabe exakt 80 Zeichen. Für Lösungsvorschlag3 wäre das etwas.


    Edit: Nein Quatsch. Das passt eher zu Lösungsvorschlag2, nicht 3

  • Noch eine Idee, aber auch nicht perfekt:

    Code
    1. 0forl=4^5to2023:pokel,123:next:a=53265:forl=.to9:l=land7:pokea,(peek(a)and240)+l:pokea+5,l:next

    Naja, die Scroll-Richtung ist eine andere, aber wenn man das +l durch +7-l ersetzt, ist es ein Zeichen zu lang...


    PS: Man könnte es natürlich im Direkt-Modus machen. Dann kann man sich die Zeilennummer sparen!