Verständtnis C-Code Bitmanipulation

OP #4513664
Hallo alle zusammen,

ich verstehe gerade meinen eigenen Code in C nicht. Bei der 
Bitverschiebung können Bits eines Wertes nach links oder rechts 
verschoben werden. Gut das habe ich hier getan.

for(int x=0;x<10;x++){
  int c = x << 1;
  int b = c << 2;
  printf("%d\n",b);
}

Nach logischer Überlegung kam ich bei den Schritten auf folgendes 
Ergebnis:

1.) 0000 => C= 0000 => b = 0000 Ausgabe b = 0
2.) 0001 => C= 0010 => b = 1000 Ausgabe b = 8
3.) 0010 => C= 0100 => b = 0000 Ausgabe b = ?? Mein Ergebnis ist b = 1

usw.

die ganze Zahlenkette ist laut Programm 0, 8, 16, 24, 32, 40, 48, 56, 
64, 72 jedoch verstehe ich nicht warum??

Warum wird im 3 Schritt anstatt meiner berechneten 1 eine 16 
ausgegeben??
Was macht meine Schleife denn da??
Gast
Du gehst bei dir von lediglich 4 Bit für Int aus, Int ist aber deutlich 
größer, häufig 16 oder 32 Bit. Das heißt dein Überlauf kommt erst 
deutlich später.
x ist im dritten Schritt 2, damit ist c = 4 (x*2) und b = 16 (c*4).
Gast
Verschoben um 1 ist Multiplikation mit 2.
Sprich in c steht 0,2,4,8...
Verschoben um 2 ist Multiplikation mit 4.
Sprich in int b steht int c*4 oder x*8.
In Zahlen 0,8,16,24...
Gast
3.)  x=0000000000000010
     c=0000000000000100
     b=0000000000010000   und das ist eben 16 in dezimal

Auch ich frage:
> wie kommst du zum schluss auf b=1?

Las ich raten: Du gehst davon aus, dass die Bits, die links heraus 
fallen, wieder von Rechts herein kommen. Das ist aber nicht der Fall. Du 
verwechselst hier das "schieben" mit "rotieren". Zum Rotieren von Bits 
hat allerdings IMHO die Sprache C keinen Operator. In Assembler würde 
das gehen.
Gast
> werden weitere vier nullen angehangen also 0000 0000 usw.??

Nein, "normale" Integer Variablen haben bei dieser Hardware-Architektur 
immer 16 Bits. Egal, welcher Wert da drin steht.
Stefan U. schrieb:
> Zum Rotieren von Bits
> hat allerdings IMHO die Sprache C keinen Operator. In Assembler würde
> das gehen.

Das geht auch mit C. Ein einigermassen intelligenter Compiler erkennt, 
was Du haben willst. Mein (schon relativ betagter) m68k-gcc macht 
beispielsweise aus
1
uint32_t rol32(uint32_t x, uint32_t n)
2
{
3
    return (x << n) | (x >> (32 - n));
4
}

das da:
1
00000154 <_rol32>:
2
     154:  202f 0004        movel %sp@(4),%d0
3
     158:  222f 0008        movel %sp@(8),%d1
4
     15c:  e3b8             roll %d1,%d0
5
     15e:  4e75             rts

Wenn ich noch ein inline dazupacke, steht nur noch das roll da.

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.