Bitmanipulation Rechtsschieben

OP #4139831
Lesenswert?
• ▲
▼
Hallo,

ich habe eine Variable von Datentyp unsigned char. Ich möchte jetzt die 
1 komplett durch das Byte schieben.

Sodass mit den nächsten Rechtsschiebungen die folgenden Ergebnisse 
entstehen.

0b01000000
0b00100000
0b00010000
0b00001000
0b00000100
0b00000010
0b00000001

Soweit sollte es über den Ausdruck funktionieren.
1
unsigned char test = 0b10000000;
2
while(1){
3
    test>>=1;
4
}

Was passiert allerdings dann mit der nächsten Rechtsschiebung, wenn die 
Variable test=0x01 ist?

Wie lasse ich die 1 dann wieder im Bit 7 setzen und den ganzen Ablauf 
von vorn beginnen?
1
unsigned char test = 0b10000000;
2
while(1){
3
    test>>=1;
4
    if(test==0x01)test=0b10000000;
5
}
Gast #4139846
Lesenswert?
• ▲
▼
> Was passiert allerdings dann mit der nächsten Rechtsschiebung, wenn die
> Variable test=0x01 ist?

Die 1 purzelt rechts raus.

> Wie lasse ich die 1 dann wieder im Bit 7 setzen und den ganzen Ablauf
> von vorn beginnen?

Wieder eine 1 links einfädeln?
#4139918
Lesenswert?
• ▲
▼
Die Idee mit den geschachtelten while-Schleifen find ich schon richtig, 
aber sollte man beim Testen nach dem Schieben nicht auf 0 testen?

unsigned char test = 0b10000000;
while(1){
    test>>=1;
    if(test==0x00)test=0b10000000;
}

oder if( ! test) { test=0b10000000; }

der Test auf 0 geht ja bei den meisten CPUs recht flott.
Gast #4139925
Lesenswert?
• ▲
▼
Was soll mit "test" passieren?
So wie gefragt, wird es der Compiler womöglich weg optimieren..
1
while(1){
2
  uint8_t test = 0b10000000;
3
  do {
4
     // hier muss etwas mit test gemacht werden
5
     // z.B. binaer_anzeige(test);
6

7
     test>>=1;
8
  }while(test !=0);
9
}

..aber das "while" ist auch nur eine "if"-Abfrage

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