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
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
Original geschrieben von phoku
wie komme ich an den wert des i-ten Bits von einem Integer i,Zählung beginnt bei 0.Code:unsigned int getBitAtPos(unsigned int n,unsigned int pos) { return (n >> pos) & ~(~0 << 1); }
8Bit?Exakt?Gibt keinen eingebauten Typ mit der Eigenschaft.und wie kann ich einen Integer mit einer Länge von 8bit (1Byte) deklarieren?
Mit 1 Byte gäbe es char (signed und unsigned).
thx!
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
???????????????????
}
Code:unsigned int setBitAtPos(unsigned int n,unsigned int pos) { return n | (1 << pos); }
int8_t, uint8_t?Original geschrieben von wraith
8Bit?Exakt?Gibt keinen eingebauten Typ mit der Eigenschaft.
Ciao,
_
Qt/KDE Entwickler
Debian Benutzer
Und was machst du,wenn CHAR_BIT > 8 ist?Original geschrieben von anda_skoa
int8_t, uint8_t?
Ciao,
_
Es gibt keinen portablen int Typ mit 8Bit.
Versteh ich jetzt nicht.Original geschrieben von wraith
Und was machst du,wenn CHAR_BIT > 8 ist?
Es gibt keinen portablen int Typ mit 8Bit.
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
Nope.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.
7.18.1.1 Exact-width integer types
Ein System mit 16 Bit chars kann keinen int8_t anbieten.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.
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
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)
Bitfelder sind unportabel (weil praktisch alles implementierungsabhängig ist) und die Benutzung wird auch von K & R abgeraten.Original geschrieben von ceisserer
Es gibt doch Bitfelder!
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).
Tja,da hattest du Glück (?),da diese Compiler eine Extension haben.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.
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
Das Vehalten ist aber undefiniert.Code:struct Byte { unsigned char a : 1; ...//8 Stück ... };
Lesezeichen