Welchen Code würdet ihr bevorzugen

Gast #2988592
Lesenswert?
• ▲
▼
Hallo :)

zum maskieren bzw. Löschen eines Bits im Byte
schwanke ich zwischen
1
variable &= ~ (1 << i);

und
1
code U8 demask[8] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F };
2
variable &= demask [i];

ersteres ist vermutlich schneller
aber letzteres uu besser lesbar

was meint ihr?
#2988633
Lesenswert?
• ▲
▼
misra ten schrieb:
> Hallo :)
>
> zum maskieren bzw. Löschen eines Bits im Byte
> schwanke ich zwischen

in welchem Zusammenhang?

Sehr oft lässt sich die Operation

>
1
> variable &= ~ (1 << i);
2
>

in einer Schleife durch eine geeignete Umstrukturierung auf eine 
Maskierung mit einer Konstanten anstatt einem variablen i umformen.

> aber letzteres uu besser lesbar

Das ist kein Argument.
Denn
1
#define CLEAR_BIT(v,i)   (v) &= ~(1<<i)
2

3

4
int main()
5
{
6
   CLEAR_BIT( vairable, i );
7
}

ist noch besser lesbar, als deine beiden Varianten.
Code kann man sich immer so zurecht legen, dass er lesbar ist.
#2989455
Lesenswert?
• ▲
▼
asdf schrieb:
> Ich mache es am liebsten so:
>
1
> variable &= 0b11101110;
2
>
> Ist übersichtlich und es lassen sich auch sehr einfach mehrere Bit
> löschen.

Das finde ich auch sehr schön, ist halt kein Standard-C. Aber wen 
kümmert's.
Ansonsten wirkt ein Kommentar oder eine gut benannte Inline-Funktion 
auch Wunder. Oder, wie schon erwähnt, ein Makro tut's auch.
#2989474
Lesenswert?
• ▲
▼
Ben _ schrieb:
> Verstehe ich möglicherweise nicht. Die Variable sieht aus wie ein
> einfacher 8-Bit-Wert (byte). Wenn ich den in R16 oder sonstwohin lade wo
> ich ANDI anwenden kann

Das I in ANDI ist schon ein deutlicher Hinweis darauf, dass du damit ein 
Register nur mit einer Konstantem verunden kannst.

   1<<i
ist aber keine Konstante, wenn i eine Variable ist.


variable &= ~ (1 << i);

  wenn i gerade den Wert 0 hat, dann wird das 0-te Bit gelöscht
  wenn i gerade den Wert 1 hat, dann wird das 1-te Bit gelöscht
  wenn i gerade den Wert 2 hat, dann wird das 2-te Bit gelöscht
  ....

Preisfrage:
Welches Bit (Bitnummer) wird denn in
1
utin8_t var;
2

3
void foo( uint8_t i )
4
{
5
  var &= ~( 1<<i );
6
}
gelöscht? Wie soll (kann, muss) dann deiner Ansicht nach die ANDI 
Instruktion dafür aussehen, die genau diesen Funktionskörper 
implementiert? Der Einfachheit halber kannst du davon ausgehen, dass der 
Inhalt von var schon in R16 liegt. Es geht nur um das ANDI.
Wenn du mal versuchst, genau diese Funktion in Assembler zu 
programmieren, kommst du drauf, dass dir nichts anderes übrig bleibt, 
als eine Schleife zu konstruieren, mit der du dir erst mal das 0-Bit an 
die richtige Stelle verschiebst um so die Maske zu erzeugen, die dann 
anschliessend verundet werden kann.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.