Parität eines Bytes

OP #708024
Lesenswert?

hab mir folgende Funktion zur Paritätsermittlung eines Bytes ausgedacht:
1
//Parität: 0 gerade, 1 ungerade
2
UI8 parity(UI8 arg)
3
{
4
  UI8 retval = 0;
5
  
6
  while (arg != 0)
7
  {
8
    retval ^= arg;
9
    arg >>= 1;
10
  }
11

12
  return (retval & 0x01);
13
}

Kann das funktionieren?
Gruß
Boxi
Gast #708127
Lesenswert?

XOR ist hier in der Tat gut geeignet.

"Einfache" Leute würden vielleicht die Anzahl Einsen abzählen, und am 
Ende gucken, ob es gerade oder ungerade ist. Damit gucken sie aber das 
letzte Bit an. Das bedingte Increment macht auf dem letzten Bit effektiv 
ein XOR mit dem Bitwert.

Ich glaube, ich habe mich nicht besonders verständlich ausgedrückt :-(
Gast #708145
Lesenswert?

@peter

Bei dir musst der Prozessor immer 7 mal schieben wenn er keinen Befehl 
hat der Mehrfachverschiebung ermöglicht.

Bei der Routine von Boxi wird im einfachsten Fall (0) gar nicht 
geschoben.

Also kann man nicht sagen das deine Routine immer schneller ist.

Gruss Helmi
#708177
Lesenswert?

Ich denke schon, dass Peters Routine in den meisten Übersetzungen im 
Mittel schneller sein dürfte.

Boxis Variante wird im Schnitt immer noch etwa 7 mal durchlaufen 
(1793/256 um genau zu sein) - der Vergleich+Sprung für Schleife ist 
nicht zu vernachlässigen.

Peters Version bietet dem Compiler recht viele Optimierungsansätze. Die 
Shift-Operation '>> 4' kann in einem Mega16 z.B. durch
SWAP oder MUL ersetzt werden. Ersteres kostet 1, zweiteres kostet 2 
Zyklen. Man kommt also für die garantierten 7 Schiebevorgänge mit 4 
Zyklen aus.

Mir ist bis jetzt nichts Schnelleres eingefallen.

Gruß

Kai

Ach ja... und die konstante Laufzeit von Peters Algorithmus gefällt mir 
besser ;)
OP #708467
Lesenswert?

Moin Falk,
>
> Bildformate die 199te!
>

Ich versteh dein ständiges Genöhle über Bildformate nicht. Kannst du mir 
bitte erklären, was ich falsch gemacht hab. Dies erschließt sich meinem 
einfach strukturiertem Hirn leider nicht aus dem Bildformate-Link und 
deinem Kommentar dazu.
Danke


Was würdest du denn gerne ge'swapped' haben?
#708478
Lesenswert?

@ Boxi Boxitec (boxi)

>Ich versteh dein ständiges Genöhle über Bildformate nicht. Kannst du mir
>bitte erklären, was ich falsch gemacht hab. Dies erschließt sich meinem
>einfach strukturiertem Hirn leider nicht aus dem Bildformate-Link und
>deinem Kommentar dazu.

Das ist wirklich schade, um nicht zu sagen bedenklich! Im 
Deutschunterricht gab es mal als Übung u.a. des Verstehen von 
Sachtexten, gabs auch in Mathematik, Textaufgaben etc. Ich versuchs mal 
pädagogisch.

Welcher Art ist dein angehängtes Bild?
In welchem Format ist es gespeichert?
Was empfiehlt der Wikiarikel für ein Format für diese Art Bilder?
Warum wird das Format empfohlen?

>Was würdest du denn gerne ge'swapped' haben?

Die 4 mal lsl kann ein AVR mittlels SWAP in EINEM Takt erledigen.

MFG
Falk
Gast #708517
Lesenswert?

Ich habe gerade mal meinen HC12 Compiler von COMIC angeschmissen.
Auch der macht kein SWAP daraus sonder shiftet 4 mal.
Auch im HC12 Instructionset Manulal von FreeScale steht kein SWAP 
Befehl.

Der kanns halt nicht.

Also ist Boxi's Routine um 1 Byte kuerzer.

Gruss Helmi
#708691
Lesenswert?

Ist ehrlich gesagt auch nicht einfach für den Compiler zu erkennen, dass 
hier auch ein SWAP geht - da es ja de facto was Anderes tut als der 
4er-Shift.

In C gibt's keine Notation für Bitrotationen, oder? - Das sollte der 
Compiler dann besser umsetzen können.

@Boxi
>Ich versteh dein ständiges Genöhle über Bildformate nicht. Kannst du mir

Na ja... es gibt halt einfach keinen Vorteil jpg zu verwenden... Das 
Bild wird größer, unscharf und kann nicht sinnvoll weiterverarbeitet 
werden. Aber passt ja jetzt :)

Gruß

Kai
Gast #1592277
Lesenswert?

Alternativ und noch ein bisschen schneller geht's mit der
Modulo-Operation:

Armin schrieb:
> Alternativ und noch ein bisschen schneller geht's mit der
> Modulo-Operation:

6 Setzen.


Modulo hat recht wenig mit Pariät zu tun.

3 und 6 habe die gleiche Parität, auch bei dir?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren