Forum: Mikrocontroller und Digitale Elektronik If Then Bitvergleich verstehen


von Rene K. (xdraconix)


Lesenswert?

Ich habe hier ein If Vergleich, den möchte ich besser verstehen lernen 
was und warum er dies tut:
1
uint8_t write_buffer[20];
2
uint8_t Var;
3
4
write_buffer[10] = (Var & 0x80) ? 8:2;


Ich verstehe dies so: in das Array write_buffer an Position 10 wird 
entweder eine 8 oder 2 geschrieben wenn in der Variable Var die 
Bitposition (mask)0b1000 0000 gesetzt ist?

Wie stelle ich dies um das ich aus write_buffer[10] (je nachdem ob dort 
eine 8 oder 2 steht) die Bitposition in Var setze?

von Peter II (Gast)


Lesenswert?

Rene K. schrieb:
> Wie stelle ich dies um das ich aus write_buffer[10] (je nachdem ob dort
> eine 8 oder 2 steht) die Bitposition in Var setze?

dann schreibe es doch einfach anders.
1
if (Var & 0x80) {
2
  write_buffer[xxxx] = 1 
3
}
4
5
if (Var & 0x40) {
6
  write_buffer[xxxx] = 1 
7
}

(nicht das ich genau verstanden hätte was du willst)

von a.s (Gast)


Lesenswert?

1
switch(write_buffer[10])
2
{
3
case 8: var |=  0x80;  break;
4
case 2: var &=~(0x80); break;
5
default: /* whatever todo if write_buffer has wrong value */ break;
6
}

von andi (Gast)


Lesenswert?

Noch eine Interpretation:
1
if (Var & 0x80) 
2
     write_buffer[10] = 8;
3
else
4
     write_buffer[10] = 2;

von NurEinGast (Gast)


Lesenswert?

Noch ne Idee
1
var = (write_buffer[10]==8)?0x80:0x0;

von Rene K. (xdraconix)


Lesenswert?

So.. ja.. :-D

Die Ideen sind alle super!

Da diese kurze (? :) if Anweisung unbedingt einen Else Zweig benötigt - 
ich diesen aber nicht brauche. Bin ich dann doch wieder bei dieser 
Anweisung gelandet:
1
if(write_buffer[10] == 8) Var |= (1<<0);

Von der Laufzeit dürfte eine normale IF Abfrage ja genau das gleiche 
ausmachen wie die kurze Schreibweise von ? - oder? Da ich dort ein Array 
von ca. 10000 Stellen durchlaufen muss.

von Quodnix (Gast)


Lesenswert?

Da ist keine Schleife, nirgends werden da 100000 Stellen durchlaufen.

Ich glaube ich habe Deine Eingangsfrage nicht verstanden.

Rene K. schrieb:
> Wie stelle ich dies um das ich aus write_buffer[10] (je nachdem ob dort
> eine 8 oder 2 steht) die Bitposition in Var setze?

Denn die Antwort darauf wäre doch simpel var und write_buffer[10] zu 
vertauschen:

Var = (write_buffer[10] & 0x80) ? 8:2;

von Quodnix (Gast)


Lesenswert?

Ach und wenn es darum geht zu verstehen was der Fragezeichenoperator 
tut: Das ist das gleich als wenn Du schreibst:

uint8_t write_buffer[20];
uint8_t Var;

if (Var & 0x80) {
    write_buffer[10] = 8;
} else {
    write_buffer[10] = 2;
}

Ich behaupt mal einfach so ungeprüft, dass der Compiler bei 
eingeschalteter Optimierung daraus identischen Maschinencode generiert.

von Rene K. (xdraconix)


Lesenswert?

Quodnix schrieb:
> Da ist keine Schleife, nirgends werden da 100000 Stellen durchlaufen.

Nein, das ist ein Abfrage, die Implementierung ist aber in einer 
Schleife.

Quodnix schrieb:
> Ich glaube ich habe Deine Eingangsfrage nicht verstanden.
>
> Rene K. schrieb:
>> Wie stelle ich dies um das ich aus write_buffer[10] (je nachdem ob dort
>> eine 8 oder 2 steht) die Bitposition in Var setze?
>
> Denn die Antwort darauf wäre doch simpel var und write_buffer[10] zu
> vertauschen:
>
> Var = (write_buffer[10] & 0x80) ? 8:2;

Ja das habe ich irgendwie umstaendlich umschrieben :-D Nein deine 
Vermutung ist falsch. write_buffer[10] beinhaltet entweder eine DEC 8 
oder 2. Je nachdem welche Wert dort drinnen steht, möchte ich in VAR ein 
Bit setzen (bei 8) oder nicht setzen (bei 2). So das ich aus 8 Byte aus 
dem Array z.b. write_buffer[10..17] ein byte in Var speichere wenn ich 
davon ausgehe das 8 = high und 2 = low ist.

Laesst sich bloed erklaren irgendwie :-D

Quodnix schrieb:
> Ich behaupt mal einfach so ungeprüft, dass der Compiler bei
> eingeschalteter Optimierung daraus identischen Maschinencode generiert.

Das Denke ich auch.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.