shift <<i, shif >>

OP (Firma: @home) #6941597
Lesenswert?
• ▲
▼
Ich lese oft ähnliche code snippets wie diesen, aber variables Shiften 
ist ganz ungünstig vom Compiler zu optimieren und es ist auch (immer) 
unnötig und auch die shift Orgie ist unüberlegt. Dieser Mist wird dann 
oft x-fach auf github immer und immer wieder in anderen Projekten 
verwendet ...

ABER dieser und ähnlicher Code lässt sich im Grunde stark optimieren 
unter Beachtung der genannten Schwachpunkte! Gibt es Ideen/Vorschläge?

for(uint8_t i=0; i!=14; i++) {
   if((((ncrc14 << (i + 2)) & 0x8000) >> 15) & 1)
   {
      tempchar[i + 77] = 1;
   }
   else
   {
      tempchar[i + 77] = 0;
   }
}
#6941618
Lesenswert?
• ▲
▼
Wieso ist dynamisches Shiften "ungünstig vom Compiler zu optimieren"? 
Wenn die Zielarchitektur sowas unterstützt ist es doch überhaupt kein 
Problem. Klar der AVR kann das nicht. Da sollte man überlegen ob man den 
Code nicht ohne dynamischen Shift machen kann. Irgendwie sieht der Code 
nach Hausaufgabe aus.
OP (Firma: @home) #6941692
Lesenswert?
• ▲
▼
Andi schrieb:
> z.B. so:

interessant und hardcore!

Ich dachte an das hier

ncrc14 <<=2;
for(uint8_t i=0; i!=14; ncrc14<<=1, i++) {
   tempchar[77+i] = !!(ncrc14 & 0x8000);
}

und da erkenne ich dann auch noch die ursprüngliche Bitstruktur.
Mein Gedanke ist keine Maske zu shiften sondern immer das Datenwort 
selbst.

Mal schauen was der Compiler aus den zwei Varianten zaubert und ob es 
eine ähnliche code size ergibt.
OP (Firma: @home) #6941708
Lesenswert?
• ▲
▼
Sebastian V. schrieb:
> Wenn die Zielarchitektur sowas unterstützt

Auch dann eher kein Argument (z.b. ARM), weil dann immer noch ein 
Register ständig modifiziert werden muss, das die shift Breite definiert 
- also weiterhin Mehraufwand im Vergleich zu shift um 1bit Position.

Sebastian V. schrieb:
> rgendwie sieht der Code
> nach Hausaufgabe aus.

Wer das schön, nochmal jung zu sein!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.