Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[TUTORIAL] Binäres Rechnen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 17.11.2007, 22:47    Titel: [TUTORIAL] Binäres Rechnen Antworten mit Zitat

Logisch rechnen für Anfänger

Ich will euch hier mal ein kleines, einfaches Tutorial für logisches, binäres Rechnen geben. Hoffe, es hilft euch, einige Dinge kompakter und effektiver umzusetzen.


Zuerst einmal zum Unterschied zwischen den einzelnen Rechensystemen.
Jeder von euch wird das "dezimale" Rechensystem aus der Schule kennen.
Dabei stellt eine Stelle den Wertebereich von 0 bis 9 dar. Wenn man zu einer einstelligen Zahl eine 1 addiert, vergrössert sich der Wert solange, bis ein Maximum der Stelle erreicht wurde, und ein Übertrag stattfinden muss.
9 + 1 = 10
Jetzt hat man eine neue Stelle erzeugt, welche ebenfalls wieder das Maximum erreichen muss, um eine weitere Stelle zu erzeugen
99 + 1 = 100
usw.

Im Vergleich zum binären Rechensystem, kann eine Stelle nur den Wertebereich von 0 bis 1 darstellen. Sollte also zu dem Wert 1 eine 1 addiert werden, findet sofort ein Übertrag statt.
1 + 1 = 10
Addiert man nun zum Maximum der beiden Stellen wieder eine 1, entsteht wieder ein Übertrag.
11 + 1 = 100
111 + 1 = 1000
usw.

Da ihr sicher das dezimale System kennt, brauche ich euch ja nicht erklären, wie man damit grossartig Rechenoperationen durchführt.
Daher beschränke ich mich mal auf das binäre System, und zeige die Beziehung der jeweiligen Zahl im binären System, zum dezimalen System auf.

Code:
Binär = Dezimal
   0 =  0
   1 =  1
  10 =  2
  11 =  3
 100 =  4
 101 =  5
 110 =  6
 111 =  7
1000 =  8
1001 =  9
1010 = 10
1011 = 11
1100 = 12
.........



Was kann man nun damit anfangen? .. nun .. "eigentlich" nicht sehr viel. Der Computer hingegen schon. Der arbeitet mit nichts anderem. Damit der Computer eure Zahl 10 und die Zahl 5 addieren kann, nutzt er sogenannte Verknüpfungsoperationen oder auch Logische-Operatoren.
Diese Operationen lauten:
Code:
 OR = Oder
AND = Und
NOT = Nicht
...


Wie arbeiten diese Operatoren?
Wenn man sich ein Bit (1 oder 0) als Schalter vorstellt, dann kann man folgende Vergleiche ziehen:
A = Schalter-A
B = Schalter-B
L = Lampe

OR
Ein "OR" sagt aus, das EINE von beiden Variablen eine 1 sein kann, um eine 1 ausgeben zu können
Code:
A (aus) OR B (aus) ergibt L (aus)
A (ein) OR B (aus) ergibt L (ein)
A (aus) OR B (ein) ergibt L (ein)
A (ein) OR B (ein) ergibt L (ein)


Ürigens: Solch einen Vergleich nennt man auch "Wahrheitstabelle". Sie zeigt auf, was passiert, wenn man einen "Schalter" ein- oder ausschaltet.

AND
Ein "AND" sagt aus, dass BEIDE Variablen jeweils eine 1 haben müssen, um eine 1 zu erhalten.
Code:
A (aus) AND B (aus) ergibt L (aus)
A (ein) AND B (aus) ergibt L (aus)
A (aus) AND B (ein) ergibt L (aus)
A (ein) AND B (ein) ergibt L (ein)


NOT
Ein "NOT" sagt aus, dass der eingehende Zustand umgedreht ausgegeben wird.
Code:
A (aus) ergibt L (ein)
A (ein) ergibt L (aus)


...

NOR, XOR, ... sind Kombinationen aus diesen Grundbefehlen.
Mehr Gatter und passende Warheitstabelle: http://de.wikipedia.org/wiki/Logikgatter

Wie das ganze mit binären Zahlen aussieht, ist auch schnell gezeigt.
Code:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1




Was hat das mit meinem Computer zu tun?
Nun .. wie oben schon gesagt, rechnet der Computer ausschliesslich im binären System, (noch, aber das ist ein anderes Thema)...
Wenn ein Computer nun die Zahl 10 zu der Zahl 2 addieren will, dann muss er diese beiden binär umgewandelten Zahlen 1010 und 11 Logisch miteinander verknüpfen. Das macht der Computer mit einer simplen Addition.
1010 + 11 = 1101
Wie kommt das Ergebnis zustande? ... naja... Simple Addition halt zwinkern So wie man dezimal einen Übertrag erzeugt, macht das der Computer auch.

Was bringt mir das nun?
Gehen wir mal davon aus, ihr schreibt ein Spiel. Dieses Spiel hat ein quadratisches Spielfeld, auf dem Wände stehen können. Jede Wand repräsentiert eine 1; keine Wand eine 0.
Hat man nun ein Feld von 8x8 Pixel, dann wären das 8 * 8 = 64 Informationen.
Ein Weg wäre, jeweils eine 1 oder eine 0 in eine Datei zu schreiben.

Code:
Dim Feld(8, 8) as Long
Dim X as Long
Dim Y as Long
Dim D as String
For Y = 1 to 8
    For X = 1 to 8
        If Feld(Y, X) = 1 Then
            D = D & "1"
        Else
            D = D & "0"
        End If
    Next
Next



Dieses Beispiel geht alle 8 Felder Höhe mit jeweils 8 Felder Breit durch, und schreibt entsprechend dem Wert im Array eine 1 oder ein 0 in einen String.
Diesen kann man nun abspeichern. Man hat quasi eine "MAP" gespeichert. Jedes Byte steht nun in dieser Datei für eine Wand oder keine Wand.

Nun .. wie man aus dem Beispiel erkennen kann, werden nur 2 Werte-Typen gespeichert .. entweder eine 1 oder eine 0. Da wir sicher wissen, dass ein Byte 8 Bit besizt, könnten wir dies nun anwenden, um unsere MAP zu "komprimieren".
Wir speichern einfach nicht jede 1 oder jede 0 in einem separaten Byte, sondern in einem gemeinsamen Byte. Das bringt uns eine Ersparnis von 1:8 ein.

Damit dies funktioniert, müssen wir uns der LOGISCHEN Berechnung zuwenden.

Und wie machen wir das nun?
Unser Byte hat 8 Bits.
Code:
- - - - - - - -


Das heißt, wir haben 8 Punkte, auf welchen wir jeweils 8 Felder speichern können.
Wenn wir nun eine 1 oder eine 0 in unser Byte speichern möchten, müssen wir erstmal wissen, an welche Position dieser Wert soll.
Die Position wäre dann 0, 1, 2, 3, 4, ... 7.
Diese Position kann man errechnen, indem man 2 ^ (hoch) Position rechnet.
Code:
2^0 = 1 = -------X
2^1 = 2 = ------X-
2^2 = 4 = -----X--
2^3 = 8 = ----X---
usw.



PS: Man rechnet immer von rechts nach links.

So .. Wir möchten nun also an jeder Position einen Wert speichern. Das können wir simpel mit dem OR-Befehl machen, indem wir den Wert einfach hinein verknüpfen:
Code:
00000000 OR 00000001 = 00000001
oder
00000001 OR 00001000 = 00001001


Code:
Dim Feld(8, 8) as Long
Dim X as Long
Dim Y as Long
Dim B as Byte
Dim D as String
For Y = 1 to 8                       'Alle Zeilen durchgehen
    B = 0                            'Beim Beginn einer neuen Zeile Wert zurücksetzen
    For X = 1 to 8                   'Alle Felder einer Zeile durchgehen
        If Feld(Y, X) = 1 Then       'Ist das Feld eine Wand?
            B = B OR (2 ^ x)         'Die Adresse errechnen und mit den bereits gespeicherten Werten verknüpfen
        End If                       'Else brauchen wir nicht, da schon alle Bit-Positionen mit 0 gefüllt sind.
    Next
    D = D & Chr(B)                   'Nach jeder fertigen Zeile den ASCII-Code erzeugen, und im String speichern.
Next



Das hätten wir. Aber nun müssen wir ja auch die Werte wieder einlesen.
Dazu benötigen wir eine "BITMASKE"
Diese Bitmaske beinhaltet an der Position eine 1, die wir auslesen möchten.
z.B. haben wir den Wert 11001100 und möchten das 4te Bit auslesen. Dazu erzeugen wir eine Maske, die dieses Bit beinhaltet 00001000. Anschliessend verknüpfen wir unsere Maske mit dem Wert, und erhalten das Bit, das sich dort befindet.
Code:
11001100 AND 00001000 = 00001000
11001100 AND 00000100 = 00000100
11001100 AND 00000010 = 00000000
11001100 AND 00000001 = 00000000



Nachdem wir nun das gesuchte Bit extrahiert haben, können wir prüfen, ob das Bit an oder aus ist.
If 00001000 = 00001000 Then
Und damit wäre das Problem schon gelöst.

Code:
Dim Feld(8, 8) as Long
Dim X as Long
Dim Y as Long
Dim B as Byte
Dim M as Byte
For Y = 1 to 8                       'Alle Zeilen durchgehen
    B = Asc(Mid(D, Y, 1))            'Auslesen des Zeilen-Bytes
    For X = 1 to 8                   'Alle Felder eine Zeile durchgehen
        M = 2 ^ (X - 1)              'Maske erzeugen (-1) deshalb, weil wir mit 0 beginnen (siehe oben)
        If (B AND M) = M Then        'Ist das Bit aktiv?
            Feld(Y, X) = 1           '1 setzen
        End If                       'Else brauchen wir nicht, da schon alles mit 0 gefüllt ist.
    Next
String speichern.
Next




So .. Ich hoffe, das ich einigen von euch helfen konnte, und ihr nun mit dem Bit-Rechnen etwas vertrauter seid als vorher zwinkern


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]


Zuletzt bearbeitet von ThePuppetMaster am 28.05.2008, 11:16, insgesamt 11-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 18.11.2007, 01:31    Titel: Antworten mit Zitat

Wer ein kleines Programm braucht, um sich diese Auswirkungen mal anzusehen: BitWise.Bas
ist eine prima Spielwiese dafür..
..und nicht vergessen: binäres Rechnen lernt sich am Einfachsten, indem man es macht zwinkern
Sinngemäß wie es im C-BUCH "Programmieren in C" beschrieben wird:
'Eine Programmiersprache lernt man dadurch, daß man Programme darin schreibt..'
Meine Ergänzung dazu: Manch einer sollte besser erst mit Print "Hello, world!" anfangen..
Bitte ein Bit lachen
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Manuel



Anmeldungsdatum: 23.10.2004
Beiträge: 1271
Wohnort: Bayern

BeitragVerfasst am: 18.11.2007, 03:15    Titel: Antworten mit Zitat

Hehe, da man als Ausbildung zu irgendeinem EDV-Hirschen ( grinsen ) sowieso früher oder später das System lernt, ist die Bitrechnung ansich eher unspektakulär (für Anfänger wahrscheinlich nicht zwinkern ), aber der Trick mit dem Komprimieren ist eine sehr sehr nette Idee. Mal sehen, in welcher Art und Weise ich das nutzen kann (mir schweben schon Ideen im Kopf rum^^.), gute Arbeit! lächeln

Gerade das mit der Bitmaske ist (für mich) interessant... Ich hab das bisher immer nur in der Theorie gehört, konnte mir aber noch nie einen praktischen Nutzen darunter vorstellen (außer bei IP-Adressen, aber da ist es ja offensichtlich[/OT])...
_________________
DL Walk (Denkspiel) | DL Malek (Denkspiel) | DL Warrior (ASCII-Adventure) | DL Sokodos (Sokoban-Klon)
---
www.astorek.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name Yahoo Messenger
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 18.11.2007, 12:07    Titel: Antworten mit Zitat

Früher auf dem Commodore 64 war es üblich, Grafiken (Sprites und eigene Zeichensätze) auf karriertem Schreibblockpapier zu entwerfen und anschliessend die Werte für DATA-Zeilen umzurechnen. Diese wurden dann in einer READ-Schleife direkt mit POKE in den gewünschten Speicherbereich abgelegt. Dann musste man beim Videochip ebenfalls mit POKE noch die Ablageadresse bekanntgeben und schon hatte man seine Grafik auf dem Schirm. Verrechnungsfehler waren umgehend in Form fehlerhafter Pixel zu erkennen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 18.11.2007, 16:38    Titel: Antworten mit Zitat

ThePuppetMaster hat Folgendes geschrieben:
2^0 = 1 = -------X
2^1 = 2 = ------X-
2^2 = 4 = -----X--
2^3 = 8 = ----X---
usw.
vor Freude klatschen mit Freude und Erstaunen stelle ich fest das du doch lernfähig bist!
Vor ein paar Monaten noch:
ThePuppetMaster hat Folgendes geschrieben:
volta hat Folgendes geschrieben:
2^0 = 1 richtig?

Nein.
2 * 0 = 0*2 oder 2^0 oder 0^2 = 0,0000000 = 0
( http://forum.qbasic.at/viewtopic.php?p=55373#55373 )

ThePuppetMaster hat Folgendes geschrieben:

NOT, XOR, ... sind Kombinationen aus diesen beiden Grundbefehlen.
Ich hoffe du glaubst mir auch das NOT nicht aus den Grundbefehlen OR und AND kombiniert werden kann, sondern selbst ein Grundbefehl ist.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 18.11.2007, 17:09    Titel: Antworten mit Zitat

volta hat Folgendes geschrieben:
vor Freude klatschen mit Freude und Erstaunen stelle ich fest das du doch lernfähig bist!

Naja.. das hat nicht wirklich was mit Lernfehig zu tun, sondern mit dem aktuellen stand, und mit meiner meinung darüber.

Ich kann ihm ja schlecht sagen, das es so sein sollte, obwohl es nicht so ist. Persönlich bin ich immernoch der meineung, das 2^0 = 0 sein sollte, und nicht 1 .. aber wie gesagt, das gehört nicht zum tut, und ihn so zu informieren, das er noch mehr fragwürdige probleme hat (der user), ist ja nicht in meinem interesse. grinsen


ThePuppetMaster hat Folgendes geschrieben:
Ich hoffe du glaubst mir auch das NOT nicht aus den Grundbefehlen OR und AND kombiniert werden kann, sondern selbst ein Grundbefehl ist.
Jo .. sry .. ich meinte NOR nicht NOT. Danke für den Hinweis!


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 18.11.2007, 17:16    Titel: Antworten mit Zitat

mit not und and kann man or basteln, mit not und or kann man and basteln. aber mit and und or nicht not. Mit solchen verknüpfungen wie nand oder nor kann man alles basteln (and, or, not)

was man aus xor und xnor (bzw equ) weiß ich so jetzt nicht und hab auch grade keine zeit drüber nachzudenken ;P sobald man irgendwie not, and und or basteln kann kann man xor und xnor basteln, in die andere richtung weiß ich aber grade nicht.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 18.11.2007, 17:18    Titel: Antworten mit Zitat

Joar .. gatter sind colle dinge in der Elektronik.. die taugen für fast alles.

PS: Tut wird noch erweitert, sofern ich zeit und gelegenheit finde.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz