Bits spiegeln / C

Gast #4611236
Hallo zusammen,

ich shifte meine Bits hiermit an die richtige Stelle, allerdings ist das 
Bild bei meiner 8x8 Matrix dann Spiegel verkehrt. Kann mir jemand 
helfen?



 seg_schieb[zaehler] = ((segment[zaehler]&0x01)<<6)
                           + ((segment[zaehler]&0x02)<<4)
                           + ((segment[zaehler]&0x04)<<2)
                           + ((segment[zaehler]&0x08)>>3)
                           + ((segment[zaehler]&0x10)>>1)
                           + ((segment[zaehler]&0x20)>>4)
                           + ((segment[zaehler]&0x40)>>4)
                           + ((~segment[zaehler])&0x80);
So vielleicht ;)

;(08x0&([ɹǝ1ɥǝɐz]ʇuǝɯbǝs~)) +
(4>>(04x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
(4>>(02x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
(1>>(01x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
(3>>(80x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
(2<<(40x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
(4<<(20x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
(6<<(10x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) = [ɹǝ1ɥǝɐz]qǝıɥɔs_bǝs


Sorry aber bei zu viel Bit-Schieberei krieg ich Kopfschmerzen :(
Bei der Ausgabe den Index Rückwerts laufen lassen?
Du schiebst Bit
00000001 << 6 = 01000000
00000010 << 4 = 00100000
00000100 << 2 = 00010000
00001000 << 3 = 01000000  // soll da wirklich so sein?

Wenn die Bits rechts falsch sind, dann musst du die Wert nach dem << 
anpassen, bzw auch noch  << durch >> ersetzen
Walter schrieb:
> dann schieb sie doch an die richtigen Stellen

Hätte Er das wirklich selbst verbrochen, wüste Er auch wies ging.


+ ((~segment[zaehler])&0x80)
+ ((segment[zaehler]&0x40)<<4)
+ ((segment[zaehler]&0x20)<<4)
+ ((segment[zaehler]&0x10)<<7)
+ ((segment[zaehler]&0x08)<<5)
+ ((segment[zaehler]&0x04)>>6)
+ ((segment[zaehler]&0x02)>>4)
+ ((segment[zaehler]&0x01)>>2);

Ohne Gewehr, Pistole und sonstigen Schweinkram.
(Hab keinen Plan was ich da gemacht habe :)
Mir stellen sich immer die Nackenhaare auf wenn ich Quellcode sehe 
welcher Bits zusammenbastelt und dann + verwendet. Ein Programmierfehler 
und das Byte ist im Hintern, warum also nicht die dafür logisch richtige 
Funktion | nutzen? Dann haben Programmierfehler in den o.g. Beispiel 
keine Auswirkung, weil man dann gezielt die gewünschten Bits beeinflußt 
und eben nicht mit der Schrotflinte zusammenprügelt...
Frank M. schrieb:
> Scheint eine (vernachlässigbare) Macke zu sein.

Aber nur, wenn der Quellcode stimmt! Und wenn an der Art der 
Bitmanipulation in einem bestimmten Programmteil sich niemals was ändern 
wird. (Bit setzen, wo vorher schon eins war) Solange man sich noch nicht 
100% sicher ist, was man tut, sollte man das '+' und die paar vielleicht 
eingesparten µs ganz schnell vergessen.
Gast
Teo D. schrieb:
> ;(08x0&([ɹǝ1ɥǝɐz]ʇuǝɯbǝs~)) +
> (4>>(04x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
> (4>>(02x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
> (1>>(01x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
> (3>>(80x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
> (2<<(40x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
> (4<<(20x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) +
> (6<<(10x0&[ɹǝ1ɥǝɐz]ʇuǝɯbǝs)) = [ɹǝ1ɥǝɐz]qǝıɥɔs_bǝs

HAHA sehr geil Teo! ;-)
Gast
hi,
anstatt Bits zu shiften, benutzt lieber enums und structs.
Mach dir lieber Gedanken über das Speichermodell dann erübrigt sich das 
shiften.
Gast
Gib's da nichts Schönes in C? In Assembler kann man die Bits rechts 
rausschieben (ins Carry) und links wieder rein. Nach 8 Schiebungen ist 
man fertig. Ein Stück Assembler in den C-Code einbauen? Wäre dann aber 
CPU-abhängier Code.
Weil es eine Matrix ist, müsste man mit dem niedrigsten Index beim 
Auslesen anfangen und mit dem höchsten Index anfangen reinzuschreiben.

Solder

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.