einzene Bits prüfen ( if (bit) {.} )

Gast #683493
Lesenswert?
• ▲
▼
Das als hardwarenahe bekannte C, hat offensichtlich seit 25 Jahren nie 
die Flexibilitaet gefunden, die Funktion expliit zu ermoeglichen . Man 
erwartet, dass der Compiler schlau genug ist das selbst herauszufinden 
und zu machen
Gast #683574
Lesenswert?
• ▲
▼
> Das als hardwarenahe bekannte C, ...

Gerade weil C so hardwarenah ist, ist das so.

Bei weitem nicht alle Mikroprozessoren haben Befehle zum Setzen,
Löschen und Abfragen einzelner Bits per Bitnummer. Aber wohl jeder
Prozessor der letzten 40 Jahre hat Befehle für bitweise
Logikverknüpfungen und Schiebeoperationen. Deswegen hat man sich dafür
entschieden, genau diese Befehle in C abzubilden. Und die
Einzelbitbefehle lassen sich ja, wie gezeigt wurde, leicht aus Logik-
und Schiebebefehlen zusammensetzen und, wenn man möchte, in Makros
kapseln.

> ... nie die Flexibilitaet gefunden, ...

Die bitweisen Logikverknüpfungen sind wesentlich flexibler als
Einzelbitbefehle, da man damit auch mehrere Bits gleichzeitig setzen,
löschen oder abfragen kann. Und beliebig viele Operatoren konnten halt
auch nicht implementiert werden, da dabei irgendwann die Sonderzeichen
auf der Tastatur ausgehen ;-)
Persönliche Seite #683609
Lesenswert?
• ▲
▼
1
char _var; // die variable in der du ein einzelnes bit abfragen willst
2

3
if ((_var & 0b00001000) >= 1) /* die 1 gibt das bit an welches du abfragen willst.*/
4
{
5
   x=y; // was auch immer dann halt passieren soll
6
}
 dabei handelt es sich um eine UND funktion bei der du schaust ob das 
ergebnis >= 1 ist oder nicht.
du musst nachschauen ob die zahl gleich grösser 1 ist denn wenn du bit 
nummer 2 setzt sind das ja dann 4 und nicht 1

hoffe du kannst damit was anfangen
#683676
Lesenswert?
• ▲
▼
Thomas Müller wrote:
>
1
> char _var; // die variable in der du ein einzelnes bit abfragen willst
2
> 
3
> if ((_var & 0b00001000) >= 1) /* die 1 gibt das bit an welches du
4
> abfragen willst.*/
5
> {
6
>    x=y; // was auch immer dann halt passieren soll
7
> }
8
> 
9
>
>  dabei handelt es sich um eine UND funktion bei der du schaust ob das
> ergebnis >= 1 ist oder nicht.
> du musst nachschauen ob die zahl gleich grösser 1 ist denn wenn du bit
> nummer 2 setzt sind das ja dann 4 und nicht 1
Und jetzt überleg mal, welche Werte das ganze überhaupt annehmen kann... 
Und irgendwann kommst Du vermutlich zu dem Schluss, dass völlig 
unabhängig davon, welches Bit es sein soll, eine Abfrage auf "> 0" 
oder "!= 0" völlig ausreicht. Und in dem Fall kann man den Vergleich 
auch komplett weglassen und einfach schreiben
1
if (var & 0b00001000)
Und den Underscore ("_") vor dem "var" solltest Du tunlichst weglassen. 
Sämtliche Bezeichner, die mit einem oder mehreren Unterstrichen 
beginnen, sind für Compiler und lib reserviert und dürfen vom 
Programmierer nicht vergeben werden.

Außerdem ist die Binärschreibweise mit "0bXXXXXXXX" nicht vom 
ANSI-Standard abgedeckt und dementsprechend wird sie nicht von allen 
Compilern unterstützt! Genau deshalb nimmt man schließlich die 
Bitschiebe-Schreibweise, die ist nämlich zu 100% portierbar, weil 
ANSI...
#683866
Lesenswert?
• ▲
▼
Just another Peter wrote:
> ich bin ja trotzdem dafür, dass man in C bits rotieren und das
> carry-flag abfragen können sollte :-(

Geht doch:
int8_t cc;cc=(cc<<1)|(cc>>7); carryflag =c&1;
Is zwar nicht so elegant, dafür muß man sich die kryptische rot/rol/rofl 
Assembler Syntax der Prozessoren nicht merken.

Cheers
Detlef

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.