eigtl. einfache frage zu bit-operatoren



  • moin

    ich lern grad c und versteh was zu den bit-operatoren etwas nich

    Mit dem bitweisen UND-Operator lässt sich sehr gut testen, ob eine Zahl gerade oder ungerade ist. Es muss nur Bit 0 (bzw. das 1. Bit) daraufhin überprüft werden, ob es gesetzt (ungerade, also = 1) oder nicht gesetzt (gerade, also = 0) ist. Folgendes Beispiel demonstriert dies:

    #include <stdio.h>

    int main()
    {
    int x;
    printf("Bitte geben Sie eine Zahl ein: ");
    scanf("%d",&x);
    if(x&1) /* Ist das erste Bit gesetzt? /
    printf("Eine ungerade Zahl\n");
    else /
    Nein, es ist nicht gesetzt */
    printf("Eine gerade Zahl\n");
    return 0;
    }

    wie soll denn das gehen? ich meine

    x&1

    sagen wir x = 7, dann ist x

    0000 0111

    1 ist 0000 0111

    also

    0000 0111
    0000 0001

    wenn man das mit dem & operatore verknuepft kommt

    0000 0001

    raus. so und was macht if nun damit? ich meine if ueberprueft doch bedinungen, und wenn bei x&1 als ergebnis 0000 0001, ja das ist doch ansich keine bedingung?!

    das einzige was ich mir vorstellen koennte:

    als ergebnis bei geraden zahlen kommt ja immer 0000 0001 raus, also = 1, bei ungeraden zahlen immer 0000 0000, also = 0.
    und 1 gilt ja als false und 0 als true oder nicht?! weil wenn ja passt es doch nicht, weil er im falle einer true bedingung der if anweisung sagt
    printf("Eine ungerade Zahl\n");

    danke fuer jede erklaerung



  • ups hab daoben etwas durcheinander gebracht

    sagen wir x = 7, dann ist x

    0000 0111

    1 ist 0000 0111

    sollte heissen

    sagen wir x = 7, dann ist x

    0000 0111

    1 ist 0000 0001

    und unten

    als ergebnis bei geraden zahlen kommt ja immer 0000 0001 raus, also = 1, bei ungeraden zahlen immer 0000 0000, also = 0.

    is ja genau andersrum, bei geraden zahlen kommt 0 raus, bei ungeraden 1.

    naja fragestellung bleibt 😉



  • > meine if ueberprueft doch bedinungen, und wenn bei x&1 als ergebnis 0000 0001, ja das ist doch ansich keine bedingung?!

    doch! es ist ein Bedingung if(true) if(false) if(0) if(5) if(1) sind alles bedingungen!



  • hae ja und was fuer ein ergebnis soll das haben, zb if(5)?
    ich kenne zb while(1) oder so als endlossschleifen, weil die bedingung immer true ist, koennte man da auch while(5) oder so nehmen, und die bedingung waere immer noch immer true? und was waere bei while(0)?

    und wenn alles true is, wie wird dann unterschieden? ich mein bei dem programm oben kann als ergebnis ja nur if(0) oder if(1) kommen, was is dann true was false? aus den ergebnissen wissen wir das 0 false und 1 true sein muss, ist dem auch so?

    fragen ueber fragen ;>



  • Wenn ein boolescher Ausdruck erwartet wird, so wird in C die 0 als false und alle anderen Zahlen als true interpretiert.



  • if(1) und if(5) bewirken das Gleiche. Die Bedingung ist immer wahr.

    C definiert FALSE als 0 und TRUE als !0. Das heißt, while(0) wird niemals ausgeführt, while (!0), while(1) ... ergeben immer eine Endlosschleife.

    Meistens wird TRUE oder true oder was auch immer als 1 definert. Sicher ist dies aber nicht. Sicher ist nur, FALSE ist immer 0.



  • Manfred Schmidtke schrieb:

    Meistens wird TRUE oder true oder was auch immer als 1 definert. Sicher ist dies aber nicht. Sicher ist nur, FALSE ist immer 0.

    Meines Wissens nach ist im C-Standard aber definiert, dass auch bei Umwandlung von bool in int für true definitiv der Wert 1 festgelegt ist.



  • achsooo ist das, vielen dank dann hab ich das jetz verstanden 🙂 also geht es bei sachen wie

    if ( x & y ) eigentlich nur dadrumm ob 0 oder etwas ungleich 0 rauskommt.

    etwas anderes was ich nicht verstehe: sagen wir alle bits sind gesetzt
    1111 1111

    damit haben wir 255. wie kommt man denn nun an zahlen groesser als 255, und wie manipuliert man die mit bit operatoren?



  • Manfred Schmidtke schrieb:

    Meistens wird TRUE oder true oder was auch immer als 1 definert. Sicher ist dies aber nicht. Sicher ist nur, FALSE ist immer 0.

    in C99 gibt es den Datentyp bool garnicht 😉
    somit gibt es auch kein true oder false, wenn man es sich nicht selbst definiert

    ein true in C++ entspricht immer dem int Wert 1 - steht so zuminderst im Standard C++98



  • Manfred Schmidtke schrieb:

    C definiert FALSE als 0 und TRUE als !0. [...] Meistens wird TRUE oder true oder was auch immer als 1 definert. Sicher ist dies aber nicht.

    Nein. Erstmal kennt C weder FALSE noch TRUE, sondern nur false und true.

    masterofx32 schrieb:

    Wenn ein boolescher Ausdruck erwartet wird, so wird in C die 0 als false und alle anderen Zahlen als true interpretiert.

    ist dabei die eine Seite. Wird ein boolscher Ausdruck jedoch als Quelle für die Zuweisung an einen anderen integralen Wert benutzt, so evaluiert false zu 0 und true zu 1.

    blubb schrieb:

    also geht es bei sachen wie

    if ( x & y ) eigentlich nur dadrumm ob 0 oder etwas ungleich 0 rauskommt.

    Yep, genauso ist das.

    blubb schrieb:

    etwas anderes was ich nicht verstehe: sagen wir alle bits sind gesetzt
    1111 1111

    damit haben wir 255. wie kommt man denn nun an zahlen groesser als 255, und wie manipuliert man die mit bit operatoren?

    Indem du einen Typ mit grösserem Wertebereich nimmst. Auf die Anwendung der Bitoperatoren hat das erstmal keinen Einfluss.



  • Vertexwahn schrieb:

    in C99 gibt es den Datentyp bool garnicht 😉

    Stimmt. In C99 heisst er:

    _Bool
    


  • groovemaster schrieb:

    blubb schrieb:

    etwas anderes was ich nicht verstehe: sagen wir alle bits sind gesetzt
    1111 1111

    damit haben wir 255. wie kommt man denn nun an zahlen groesser als 255, und wie manipuliert man die mit bit operatoren?

    Indem du einen Typ mit grösserem Wertebereich nimmst. Auf die Anwendung der Bitoperatoren hat das erstmal keinen Einfluss.

    also hat char, da es nur 1 byte gross ist, nur einen wertebereich bis maximal 255? o_O

    ein int ist ja 4 bytes gross, wie wird das denn dargestellt?
    00000000 00000000 00000000 00000000 <- das ist sind dann 4 bytes = ein int?

    kennt ihr vielleicht ein tutorial/gutes buch was solche kentnisse vielleicht mit hinsicht auf c vermittelt, wie ihr seht haperts da bei mir ; )



  • das sagt C99 zum Thema bool:

    7.16 Boolean type and values <stdbool.h>

    The header <stdbool.h> defines four macros.

    The macro
    bool
    expands to _Bool.

    The remaining three macros are suitable for use in #if preprocessing directives. They are

    true
    which expands to the integer constant 1,

    false
    which expands to the integer constant 0, and

    _ _bool_true_false_are_defined
    which expands to the integer constant 1.

    Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then redefine the macros bool, true, and false.213)



  • kennt ihr vielleicht ein tutorial/gutes buch was solche kentnisse vielleicht mit hinsicht auf c vermittelt, wie ihr seht haperts da bei mir ; )
    

    da hab ich tatsächlich ein Buch für dich: http://courses.iicm.edu/the_c_book/SoftwareentwicklungInC.pdf

    siehe 5.4 Bitoperationen



  • Vertexwahn schrieb:

    in C99 gibt es den Datentyp bool garnicht 😉
    somit gibt es auch kein true oder false, wenn man es sich nicht selbst definiert

    Falsch. In C99 gibt es schon einen boolschen Datentyp ➡ _Bool. Dieser ist aber nicht direkt zu verwenden, sondern über <stdbool.h> wird er zu bool (wie in C++). Dort findet man übrigens auch false und true, die allerdings Makros sind und nicht wie in C++ echte Literale (bzw. Schlüsselworte).

    edit:
    Oh mann, viel zu spät.



  • blubb schrieb:

    also hat char, da es nur 1 byte gross ist, nur einen wertebereich bis maximal 255? o_O

    Nein. ein char hat den Wertebereich von -128 bis +127.
    Ein unsigned char geht von 0 bis 255.

    blubb schrieb:

    ein int ist ja 4 bytes gross, wie wird das denn dargestellt?
    00000000 00000000 00000000 00000000 <- das ist sind dann 4 bytes = ein int?

    Ein int ist nicht zwangsläufig 4 Bytes groß. Das hängt von der Implementation ab. Auf 32-Bit Systemen ist es allerdings tatsächlich 4 Bytes groß.

    blubb schrieb:

    kennt ihr vielleicht ein tutorial/gutes buch was solche kentnisse vielleicht mit hinsicht auf c vermittelt, wie ihr seht haperts da bei mir ; )

    http://www.pronix.de/modules/C/openbook/
    Hab's zwar selbst nie ganz gelesen, aber alles was ich gelesen habe war gut erklärt.



  • @groovemaster:

    du bist einfach zu langsam 😃



  • TactX schrieb:

    Nein. ein char hat den Wertebereich von -128 bis +127.
    Ein unsigned char geht von 0 bis 255.

    in C++98 seihts so aus: es ist nicht sicher ob ein char unsigend oder signed ist - was sagt da C99 dazu (ich glaube das selbe - womit die interne Bitstellung dann anders als Wert interpretiert wird)?



  • TactX schrieb:

    Nein. ein char hat den Wertebereich von -128 bis +127.

    Nope. Zum einen hängt das von der Grösse eines chars ab. Und zweitens sind char, signed char und unsigned char 3 unterschiedliche Typen. char kann je nach Implementation entweder signed oder unsigned sein.



  • @TactX
    achso, ja stimmt mit den char/unsigned char, macht ja sinn : ) und da ich nur auf x86 arbeite is mir das ladde 😉 wo ist denn ein int nicht 4 byte gross? schon auf ia64 oder auch auf ppc oder so

    wg dem buch: ja in dem buch sind zwar pointer unglaublich gut erklaert, aber die bit operatoren kommen dort vieel zu kurz, das kann man sich schenken

    @Vertexwahn
    vielen dank, hab ma angefangen zu lesen, ist ja sehr ausfuerhlich und gut geschrieben, und vielleicht wird da auch direkt meine naechsten fragen wg flags beantwortet 😃
    thx :>



  • Vertexwahn schrieb:

    in C++98 seihts so aus: es ist nicht sicher ob ein char unsigend oder signed ist - was sagt da C99 dazu (ich glaube das selbe - womit die interne Bitstellung dann anders als Wert interpretiert wird)?

    c99 schrieb:

    The three types char, signed char and unsigned char are collectively called the character types. The implementation shall define char to have the same range, representation and behavior as either signed char or unsigned char.[35]

    [35]CHAR_MIN, defined in <limits.h>, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options. Irrespectively of the choice made, char is a separate type from the other two and is not compatible with either.


Anmelden zum Antworten