Gerade Parität berechnen

Gast #38875
Hallo!
Ich habe ein eher kleines Problem! Ich möchte eine gerade Parität für
ein Byte berechnen. Vielleicht wirft jemand einen Blick auf den Code
und sagt mir, ob ich einen Denkfehler gemacht habe oder ob das so
hinhaut.

bitcount=0;
  for (j=7;j>0;j--)
    bitcount += byte>>j;
if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8))
    cbi(UCSR0B,TXB8);
  else
    sbi(UCSR0B,TXB8);

Danke

Tobi
Gast #38876
kleines Update: Ich habs noch ein bischen verändert:

bitcount=0;
  for (j=7;j>0;j--)
    if (byte>>j)
      bitcount++; 
if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8))
    cbi(UCSR0B,TXB8); //ParityBit löschen
  else
    sbi(UCSR0B,TXB8);//ParityBit setzen
Gast #38877
1) Du mußt j mit 8 initialisieren. Du zählst eins zu wenig.
2) Es reicht, wenn Du das LSB von bitcount testest

Davon unabhängig habe ich das mal ein wenig umgestrickt:

bool IsOddParity(unsigned char byt)
{
  int bitcount;

    for(bitcount = 0; byt; byt >>= 1)
        if(byt & 1)
            ++bitcount;

  return(bitcount & 1);
}

bool IsEvenParity(unsigned char byt)
{
  return(!IsOddPar(byt));
}

.
.
.

if(IsEvenParity(byte))
    cbi(UCSR0B,TXB8); //ParityBit löschen
else
    sbi(UCSR0B,TXB8);//ParityBit setzen
Gast #38878
Ich verstehe den Code leider nicht wirklich. Und kompilieren tut er ihn
auch nicht, also werde ich erstmal meinen Code benutzen und j mit 8
initialisieren!

Danke

Tobi
Gast #38879
Leider funktioniert die Berechnung auchnicht, wenn ichj mit 8
initialisiere:
bitcount=0;//new parity routine
  for (j=8;j>0;j--)
    if ((byte>>j) & 1)
      bitcount++;
  while (bit_is_clear(UCSR0A,UDRE)) ;
  if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8)){
    cbi(UCSR0B,TXB8);
    sbi(PORTC,PC0);//switch LED off
  }else{
    sbi(UCSR0B,TXB8);
    cbi(PORTC,PC0);  //switch LED on
  }


Findet jemand den Fehler? Ich sehe ihn nämlich leider nicht!

Tobi
Gast #38880
bitcount=0;//new parity routine
  for (j=8;j>0;j--)
    if ((byte>>j) & 1)
      bitcount++;
  while (bit_is_clear(UCSR0A,UDRE)) ;

in deiner Schleife werden Bit 8 bis 1 abgefragt anstatt 7 bis 0!
    for (j=7; j>=0;j--)

if((bitcount==0)||(bitcount==2)||(bitcount==4)||(bitcount==6)||(bitcount 
==8)){

diese if-Abfrage geht ein wenig kürzer:
if (!(bitcount & 1))  /* bitcount gerade? */

    cbi(UCSR0B,TXB8);
    sbi(PORTC,PC0);//switch LED off
  }else{
    sbi(UCSR0B,TXB8);
    cbi(PORTC,PC0);  //switch LED on
  }

mfg
werner
#38883
Die ungerade Parität ist einfach das XOR über alle Bits:

P=bit0^bit1^bit2^bit3^bit4^bit5^bit6^bit7


Für die gerade Parität invertiert man das ganze nochmal.

Als Kode kann das dann z.B. so aussehen:


unsigned char even_parity( unsigned char i )
{
  i ^= i >> 4;          // xor bit wise: 0=0^4, 1=1^5, 2=2^6, 3=3^7
  i ^= i >> 2;          // xor bit wise: 0=0^2, 1=1^3
  i ^= i >> 1;          // xor bit wise: 0=0^1
  return ~i & 1;        // return even: 1, odd: 0
}


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.