Hallo,
Ich arbeite mich schon seit Stunden durch unzählige Foren durch, auf der
Suche nach einer Hilfe. Mein Problem ist, dass ich die Parität einer
Binärzahl in einem Register bestimmen möchte.
Mein Ansatz: In einem weiteren Register die aktuelle Parität (während
der Berechnung speichern) und diese immer mit der letzen Ziffer vom
ersten Register XORen.
Mit srl kann ich die Ziffern natürlich verschieben, wie komme ich
allerdings an die letze Ziffer? Und wie kann ich eine Schleife
schreiben, die das eleganter löst?
Bitte nicht einfach Programmcode posten, eine Erklärung zur Verständnis
würde mir wesentlich mehr helfen. Danke im Voraus!
Du kennst die Anzahl der Bits pro Register, also kennst du die Anzahl
der nötigen Schiebevorgänge, bis alle Bits aus dem Register raus sind.
Es spielt keine Rolle, wieviele und welche Bits in deinem Register
gesetzt sind, denn dein Algorithmus soll ja nicht die Parität der
unteren N Bits berechnen, sondern die des ganzen Registers.
Also nimm dir drei Register:
- ein Register mit deinem Wert
- ein Register mit der Startparität
- ein Register mit dem Zählwert (vermutlich 31 oder 32).
Den Rest solltest du allein hinkriegen. :-)
Im Übrigen ist der Begriff "Ziffer" ungünstig gewählt. In deinem
Register steht eine Binärzahl, und deren Ziffern nennt man Bits.
Hallo,
sag mal welches Register in welcher CPU.
viele Prozessoren haben ein "Paritätsbit im Statusregister" und man muss
nur irgendwie erzwingen dass es gesetzt wird!!!
Gruss
Im Titel steht MIPS. Und in der Lehre ist das vmtl immer 32-Bit. Spar
dir die Mühe, nach einem Statusregister zu suchen, es gibt keines.
NB: Ein Parity Bit im Statusregister ist ausserhalb der Welt der
Intel-Architekturen nicht sonderlich häufig.
Wenn es schnell gehen soll, könnte man sich eine Paritäts-Tabelle mit
256 Einträgen für je 8 Bits machen und die errechneten Tabellenwerte für
alle 4 Bytes xor oder addieren.
Hallo Marti,
leg dir am besten für diese Webseite ein Lesezeichen an:
https://graphics.stanford.edu/~seander/bithacks.html
Dort sind 5 Varianten erklärt.
Auch für andere Rechnungen mit Bits gibt es auf dieser Seite wunderbare
Hilfe!
Freundliche Grüße
Ein Informatiker
Ich gehe mal stark davon aus, dass es sich hierbei um eine Hausaufgabe
handelt. In einer MIPS-Assembler-Prüfungsklausur wird dir dein Prof was
husten, wenn du da so rangehst. :-)
Danke für die zahlreichen Antworten!
S. R. schrieb:> Du kennst die Anzahl der Bits pro Register, also kennst du die Anzahl> der nötigen Schiebevorgänge, bis alle Bits aus dem Register raus sind.
Leider verstehe ich noch nicht, was ich genau mit dem Schieben machen
soll. Beispiel:
Mein Wert beträgt 111, meine Startparität (sinnvollerweise) 0 und mein
Zählwert 32. Ich würde dann gerne das letzte Bit des Wertes jeweils mit
dem aktuellen Parität XORen und das Ergebnis in der Parität speichern.
Den Wert dann um ein Bit nach rechts verschieben und das Ganze Zählwert
mal wiederholen. Aber mit XOR wird ja jedes Bit geXORt, nicht nur das
letzte. Also:
111 XOR 000 = 111
011 XOR 111 = 100
001 XOR 100 = 101
Da habe ich noch nicht raus, wie sich das realisieren lässt. Für Hilfe
wäre ich dankbar!
Jetzt habe ich es glaube ich verstanden! Ich mache genau das wie in
meinem letzten Post beschrieben und am Ende nutze ich andi $Parität,
$Parität, 1. Richtig?
Ich möchte in meinem Register, das die Parität angibt, gerne eine 0 oder
eine 1 stehen haben. Dafür nutze ich bitweise den and Befehl für Parität
(zum Beispiel 101) und 1 (=> 001), was dann 001 = 1 ergibt
Mensch BitSchieber, ich bin zwar dankbar für jeden, der mir helfen will,
aber einfach nur eine richtige Lösung bringt mich ja wohl nicht weiter.
a) habe ich den Ehrgeiz zu verstehen, was ich mit meinem Namen abgebe
und b) möchte ich meine Klausur später auch erfolgreich schreiben können
Versuchen das Rad neu zu erfinden ist oft nicht der beste Ansatz. Nimm
doch einfach eine gute, bekannte Lösung (wie angegeben zum Beispiel),
klatsch die in eine .c Datei, mach ein paar printfs an interessanten
Stellen dazu und lass es laufen. Dann geh mit dem Bleistift durch das
Programm und die vergleich mit der printf Ausgabe.
Ich glaube so kannst du in so einem Fall mehr lernen. Wenn du dann eine
eigene, andere, bessere, Lösung abgeben möchtest, dann kannst du ja ein
bisschen dran rumschrauben, sobald du es verstanden hast.
Marti schrieb:> Jetzt habe ich es glaube ich verstanden!> Ich mache genau das wie in meinem letzten> Post beschrieben und am Ende nutze ich> andi $Parität, $Parität, 1. Richtig?
Solange du dir nicht die Eingangsdaten überschreibst, ja.
Ich kann kein MIPS-Assembler. :-)
Du kannst auch vier Register benutzen:
- A: Eingangswert
- B: temporäres Register
- C: Ergebnisregister
- D: Zählregister