PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bit-Operationen



phoku
03-09-2003, 15:50
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

wraith
03-09-2003, 16:14
Original geschrieben von phoku
wie komme ich an den wert des i-ten Bits von einem Integer i,



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).

phoku
03-09-2003, 16:47
thx!

phoku
03-09-2003, 17:14
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
???????????????????
}

wraith
03-09-2003, 17:24
unsigned int setBitAtPos(unsigned int n,unsigned int pos)
{
return n | (1 << pos);
}

anda_skoa
03-09-2003, 17:55
Original geschrieben von wraith
8Bit?Exakt?Gibt keinen eingebauten Typ mit der Eigenschaft.


int8_t, uint8_t?

Ciao,
_

wraith
03-09-2003, 18:01
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.

anda_skoa
05-09-2003, 16:22
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,
_

wraith
05-09-2003, 20:44
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

Lin728
08-09-2003, 06:33
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

wraith
08-09-2003, 12:43
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


struct Byte {
unsigned char a : 1;
...//8 Stück
...
};

Das Vehalten ist aber undefiniert.