If Then Bitvergleich verstehen

OP #4988675
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?
Gast #4988683
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)
OP #4988722
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.
Gast #4988743
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;
Gast #4988747
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.
OP #4988785
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.

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