Anzeige:
Ergebnis 1 bis 11 von 11

Thema: Bit-Operationen

  1. #1
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97

    Bit-Operationen

    Hallo,

    wie komme ich an den wert des i-ten Bits von einem Integer i, wie kann ich die i-te Stelle verändern und wie kann ich einen Integer mit einer Länge von 8bit (1Byte) deklarieren?

    mfg und thx
    phoku

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: Bit-Operationen

    Original geschrieben von phoku
    wie komme ich an den wert des i-ten Bits von einem Integer i,
    Code:
    unsigned int getBitAtPos(unsigned int n,unsigned int pos)
    {
    	return (n >> pos) & ~(~0 << 1);
    }
    Zählung beginnt bei 0.

    und wie kann ich einen Integer mit einer Länge von 8bit (1Byte) deklarieren?
    8Bit?Exakt?Gibt keinen eingebauten Typ mit der Eigenschaft.
    Mit 1 Byte gäbe es char (signed und unsigned).

  3. #3
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97
    thx!

  4. #4
    Registrierter Benutzer
    Registriert seit
    30.01.2003
    Beiträge
    97
    kann man auch genauso schnell ein Bit an einer Stelle auf 0 oder 1 setzen?

    unsigned int setBitAtPos(unsigned int n,unsigned int pos,unsigned int value) {
    // Setzt das bit an Stelle pos in Zahl n auf Wert value
    ???????????????????
    }

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Code:
    unsigned int setBitAtPos(unsigned int n,unsigned int pos)
    {
    	return n | (1 << pos);
    }

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: Re: Bit-Operationen

    Original geschrieben von wraith
    8Bit?Exakt?Gibt keinen eingebauten Typ mit der Eigenschaft.
    int8_t, uint8_t?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: Re: Re: Bit-Operationen

    Original geschrieben von anda_skoa
    int8_t, uint8_t?

    Ciao,
    _
    Und was machst du,wenn CHAR_BIT > 8 ist?
    Es gibt keinen portablen int Typ mit 8Bit.

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: Re: Re: Re: Bit-Operationen

    Original geschrieben von wraith
    Und was machst du,wenn CHAR_BIT > 8 ist?
    Es gibt keinen portablen int Typ mit 8Bit.
    Versteh ich jetzt nicht.
    Ein int8_t ist immer 8 Bit lang.

    Wenn der Compiler es nicht direkt auf char abbilden kann ist das sein Problem, bzw das der Compilerbauer.
    Da muss er halt dann tricksen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: Re: Re: Re: Re: Bit-Operationen

    Original geschrieben von anda_skoa
    Versteh ich jetzt nicht.
    Ein int8_t ist immer 8 Bit lang.

    Wenn der Compiler es nicht direkt auf char abbilden kann ist das sein Problem, bzw das der Compilerbauer.
    Da muss er halt dann tricksen.
    Nope.
    7.18.1.1 Exact-width integer types
    The typedef name intN_t designates a signed integer type with width N, no padding
    bits, and a two’s complement representation. Thus, int8_t denotes a signed integer
    type with a width of exactly 8 bits.
    2 The typedef name uintN_t designates an unsigned integer type with width N. Thus,
    uint24_t denotes an unsigned integer type with a width of exactly 24 bits.
    3 These types are optional. However, if an implementation provides integer types with
    widths of 8, 16, 32, or 64 bits, it shall define the corresponding typedef names.
    Ein System mit 16 Bit chars kann keinen int8_t anbieten.
    Daher wird von den Gurus (comp.lang.c),von der Verwendung abgeraten.
    Stattdessen
    The typedef name int_leastN_t designates a signed integer type with a width of at
    least N, such that no signed integer type with lesser size has at least the specified width.
    Thus, int_least32_t denotes a signed integer type with a width of at least 32 bits.
    2 The typedef name uint_leastN_t designates an unsigned integer type with a width
    of at least N, such that no unsigned integer type with lesser size has at least the specified
    width. Thus, uint_least16_t denotes an unsigned integer type with a width of at
    least 16 bits.
    3 The following types are required:
    int_least8_t
    int_least16_t
    int_least32_t
    int_least64_t
    uint_least8_t
    uint_least16_t
    uint_least32_t
    uint_least64_t

  10. #10
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Warum keine Bitfelder?

    Es gibt doch Bitfelder!
    Ich habe sowas auch einmal benötigt, da ich direkte HW-Zugriffe gemacht habe, und da ging das wunderbar. Ein bitfelkd mit 8 bits wurde von allen getesteten Compiliern (gcc und MSVC) wie ein char gehandhabt.

    lg
    Geändert von Lin728 (19-08-2017 um 18:00 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: Warum keine Bitfelder?

    Original geschrieben von ceisserer
    Es gibt doch Bitfelder!
    Bitfelder sind unportabel (weil praktisch alles implementierungsabhängig ist) und die Benutzung wird auch von K & R abgeraten.
    Außerdem wird der Code (den der Compiler zum Zugriff erzeugen muß),aufgebläht,und es ist meist langsamer wie eigene Maskierungsfunktionen.
    Weiterhin gibt es keine Vektoren von Bitfelder,und Bitfelder haben keine Adressen (kein & Operator).

    Ich habe sowas auch einmal benötigt, da ich direkte HW-Zugriffe gemacht habe, und da ging das wunderbar. Ein bitfelkd mit 8 bits wurde von allen getesteten Compiliern (gcc und MSVC) wie ein char gehandhabt.
    Tja,da hattest du Glück (?),da diese Compiler eine Extension haben.
    Bitfelder dürfen nach dem Standard nur als int (signed,unsigned) vereinbart werden,also ist sizeof(Bitfield) mindestens sizeof(int).
    Wahrscheinlich hast du dein Bitfeld so deklarriert
    Code:
    struct Byte {
    unsigned char a : 1;
    ...//8 Stück
    ...
    };
    Das Vehalten ist aber undefiniert.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •