int in bits umwandeln

lonol15

Mitglied
Hi,
mir ist klar das dieses Thema hier wahrscheinlich schon des öfteren besprochen wurde und der Algorithmus ist mir auch bekannt.

Allerdings hatte ich eine andere Idee wie man das eleganter machen könnte:
Man hat ein int im Arbeitsspeicher und lässt nun einen bool Zeiger darauf zeigen und schon könnte man die einzelnen bits abrufen.

Nur klappt das in der Praxis irgendwie nicht. Die bits stimmen hinten und vorne nicht. Habt ihr eine Idee wieso?

Hier der Code:

Code:
int a=2;
    
    bool *b;
    b=(bool*)&a;

    int s;
    for(s=0;s<sizeof(int)*8;s++)
    {
        if(*(b+s))
        {
            printf("1");
        }else
        {
            printf("0");
        }
    }

Achja und eine andere Frage: was gibt sizeof() zurück? bytes oder bits?
Nun gut, die Frage hat sich geklärt. Aber wieso gibt sizeof(bool) dann 1 also 8 bit zurück?
 
Zuletzt bearbeitet:
Hab mir die Frage selbst beantwortet. Meine Zweite Frage beantwortet die erste. Ein bool ist 8 bit groß und somit funktioniert meine Idee nicht.
 
Hallo,

sizeof(bool) gibt 1 zurück, weil bool 1 Byte groß ist und nicht 1 Bit. Wenn du an die bits möchtest, dann kannst du mit Bitweisen Operatoren arbeiten.

Grüße,
Jennesta
 
Ein bool ist 8 bit groß und somit funktioniert meine Idee nicht.
Grund ist, dass es auf unseren handelsüblichen Computern
hardwaremäßig einfach nicht möglich ist, einzelne Bit zu adressieren/verarbeiten/etc.
Kleiner als Bytes gehts nicht.

edit: Auch mit den sog. bitweisen Operatoren arbeitet man wieder mit Byte-großen Werten.
 
Was du machen kannst sind Bit-fields.
C++:
struct BitMask
{
	union {
		uint32 value;

		struct {
			uint8 value;
		} bytes[4];

		struct {
			bool bit1 : 1;
			bool bit2 : 1;
			bool bit3 : 1;
			bool bit4 : 1;
			bool bit5 : 1;
			bool bit6 : 1;
			bool bit7 : 1;
			bool bit8 : 1;
			bool bit9 : 1;
			bool bit10 : 1;
			bool bit11 : 1;
			bool bit12 : 1;
			bool bit13 : 1;
			bool bit14 : 1;
			bool bit15 : 1;
			bool bit16 : 1;
			bool bit17 : 1;
			bool bit18 : 1;
			bool bit19 : 1;
			bool bit20 : 1;
			bool bit21 : 1;
			bool bit22 : 1;
			bool bit23 : 1;
			bool bit24 : 1;
			bool bit25 : 1;
			bool bit26 : 1;
			bool bit27 : 1;
			bool bit28 : 1;
			bool bit29 : 1;
			bool bit30 : 1;
			bool bit31 : 1;
			bool bit32 : 1;
		};
	};
};

Das ist nicht ganz 100% dem Standard entsprechend, dieser sieht keine unnamed structs vor, aber du kannst die Struct wie die obigen auch mit nem Namen versehen (bsp bits). Du kannst das dann so verwenden:
C++:
	BitMask bm;
	bm.value = 0x298;
	std::cout
		<< bm.bit32
		<< bm.bit31
		<< bm.bit30
		<< bm.bit29
		<< bm.bit28
		<< bm.bit27
		<< bm.bit26
		<< bm.bit25
		<< bm.bit24
		<< bm.bit23
		<< bm.bit22
		<< bm.bit21
		<< bm.bit20
		<< bm.bit19
		<< bm.bit18
		<< bm.bit17
		<< bm.bit16
		<< bm.bit15
		<< bm.bit14
		<< bm.bit13
		<< bm.bit12
		<< bm.bit11
		<< bm.bit10
		<< bm.bit9
		<< bm.bit8
		<< bm.bit7
		<< bm.bit6
		<< bm.bit5
		<< bm.bit4
		<< bm.bit3
		<< bm.bit2
		<< bm.bit1;

	std::cout << std::endl;

Grüsse
Cromon
 
Zurück