Schieben von Bits

Florian

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich habe da ein Problem.
Ich muss die Funktion des FC 92 selbst programmieren.
Es soll also ein Schieberegister werden, dem ich die Anzahl der zu schiebenden Bits vorgebe, die Adresse ab welchem Bit geschoben werden soll muss ebenfalls eingeben werden. Ausserdem muss man angeben können, ob das Bit das eingeschoben wird "0" oder "1" ist.
Leider weiß ich nicht wie ich anfangen soll.
Für einen Denkanstoß wäre ich wirklich dankbar!

Gruß
Florian
 
Hallo nochmal,

ich glube ich habe jetzt einen brauchbaren Lösungsansatz gefunden.
Leider klappt es mit der Umsetztung noch nicht so, hoffe ihr könnt mir helfen den ich bin blutiger Anfänger.

1.Pointer erzeugen, der auf das Startbit zeigt wo das Bit eingeschoben werden soll
2.Das Bit auf das der Pointer nun zeigt in ein temporären Speicher (Temp1) ablegen
3. Das einzuschiebende Bit nun in die Adresse schieben, auf das der Pointer zeigt
4. Den Pointer um 1 nach links schieben

5. SChleifenanfang mit n Durchläufen:
6. den Inhalt von Temp 1 in Temp2 schieben
7. Das Bit auf das der Pointer nun zeigt, in Temp1 sichern
8. Inhalt von Temp2 in die Adresse schiebn, auf das der Pointer zeigt
9. Pointer 1 nach links schieben
10. Sprung auf Schleifenanfang

11. Ende

Kann man das so machen, oder ist es völlig unbrauchbar?
Ich bin echt für jede Hilfe dankbar!

Gruß Florian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
wenn irgendwas nicht klar ist, dann müßt ihr einfach fragen!
Wäre schön wenn ihr kurz eure Meinung zu meinem Lösungsansatz schreiben könntet, weil ich echt nicht mehr weiter weiß.
Vielleicht bin ich ja auf dem Holzweg...

Vielen Dank!

Gruß Florian
 
Hallo,
direkt helfen kann ich dir nicht, aber hast du hier mal die Suchfunktion benutzt? Also da kommen ja doch viele Beiträge zum Thema Schieberegister vielleicht kannst du da mal mit rein gucken, sonst weiß ich es leider auch nicht.
Gruß
 
Gib' mal ein paar konkrete Beispiele anhand von Bitmustern vor und nach dem Schieben, sowie den dazugehörigen Parametern.

Vielleicht läßt sich da was machen.

Mit einer einfachen XOR - Verknüpfung kannst du z.B. alles nach links schieben.
 
@Florian

Beispiel nicht zu öffnen, mach doch mal ne einfache Textdatei.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hoffe man erkennt was ich meine:

vor dem schieben:

(o.7) 00111010 (0.0) an 0.4 wird eine 0 eingeschoben
(1.7) 00111010 (1.0)
(2.7) 00111010 (2.0)


nach dem schieben:

(o.7) 01101010 (0.0)
(1.7) 01110100 (1.0)
(2.7) 00111000 (2.0)

mit eingang N will ich festlegen wieviel Bits verschoben werden sollen, also hier z.B.14
das letzte Bit wird rausgeschoben und geht verloren
Und mit Eingang S_BIT will ich festlegen wo das Bit eingeschoben werden muss (also hier 0.4)
Ebenfalls will ich festlegen können, ob das Bit was ich einschiebe 1 oder 0 ist (also hier 0)

Gruß Florian
 
Eigentlich hätte ein Aufschrei durch das Forum gehen müssen.:cool:
Mit der von mir angegebenen Bitmaske invertiert man Bits und kann damit kein Schieberegister bauen. Mein Fehler.

Meine Tangasi T30 Kenntnisse (alter mit Assembler programmierbarer Prozessor) sind schon etwas eingerostet.

Also hier die Lösung:

Nehmen wird mal an wird haben die Zahl 18 (0001 0010) in dem Double stehen und wollen das ganze um 2 Stellen nach links schieben.

Eine einfache Muliplikation mit 2^2 bringt die Verschiebung. (^2 entspricht den Stellen um die verschoben werden soll)

Als Ergebnis erhalten wir 72 (0100 1000).


Da wir aber nicht alle Stellen, sondern nur die ersten 4 verschieben wollen bauen wir uns 2 Filter:
(Bei den Filtern entspricht ^4 den Stellen die stehen bleiben sollen)

Einmal filtern wir die ersten 4 Stellen des Ergebnisses mit

0100 1000
&1111 0000 (2^8 - 2^4)
=0100 0000

Danach filtern wir den Ursprungswert mit einem zweiten Filter:

0001 0010
&0000 1111 (2^4 - 1)
=0000 0010

Die beiden Filterergebnisse verknüpfen wird durch ein OR miteinander:

0100 0000
^0000 0010
= 0100 0010


Ist das das Ergebnis das du erzielen willst?

Wo willst du das Bit einschieben, an welcher Stelle an dem hier angeführten Beispiel?
 
Hallo CrazyCat,

erst mal danke für deine Mühe. So ganz versteh ich das noch nicht.
Anfangswert:
0001 0010
wie würde es denn aussehen, wenn an der zweiten stelle von rechts eine 1 eingeschoben werden soll und nur ab der 1. stelle bis zur 4. stelle (die adresse 0.0 wird mitgezählt) um eins nach links geschoben werden soll also:

0000 0110 die 1 in 0.4 wird rausgeschoben.

Gruß Florian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es sollen also auch Zwischenbereiche (z.B. Bit 2 bis Bit 6) geschoben werden, wobei kein Übertrag in das nächste Bit (z.B. Bit 7) erfolgt.

Verstehe ich das richtig?
 
Schieben einzelner Bits

Hallo,

um einzelne Bits zu schieben, gibt es bei S7 die Zuweisung z.B.:

U M0.5
= M0.6
U M0.4
= M0.5
U M0.3
= M0.4
U M0.2
= M0.3

Dieses Beispiel schiebt 4 einzelne Bits bei jedem Aufruf gnadenlos nach links.
 
Nur ist es nicht sehr dynamisch, wenn ich nur 3 Bits schieben will, muss ich das ganze Programm ändern oder alle Möglichkeiten abdecken (und das sind sehr viele)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zuerst alles mit 2 multiplizieren:

0001 0010 (18) * 2
= 0010 0100 (36)

Nun eine Bitmaske durch Rechnen von 2^(Endposition + 1) - 1 - 2^(Endposition - 1) erzeugen
-> 2^5 - 1 - 2^0 = 30

Die Maske mit dem Ergebnis verknüpfen (UND)

0010 0100 (36)
&0001 1110 (30)
=0000 0100 (4)

Nun die Maske invertieren durch ein XOR

0001 1110 (30)
XOR 1111 1111
= 1110 0001

Mit diesem Ergebnis den Urpsrungswert durch ein UND filtern

0001 0010 (18)
& 1110 0001
= 0000 0000 (0)

Nun die Ergebnisse der Filterungen einfach durch ein OR miteinander verknüpfen und man erhält schon beinahe das Endergebnis

0000 0000 (0)
OR 0000 0100 (4)
= 0000 0100


Zum Einschieben eines Bits einfach noch 2^Einschiebeposition zum Ergebnis addieren. (Hier 2^1 = 2)

0000 0100 (4)
+0000 0010 (2)
=0000 0110 (6)

Das war's!
 
Zurück
Oben