C++ Binärzahl zuweisen?

Altivec

Aktives Mitglied
Thread Starter
Dabei seit
29.05.2006
Beiträge
1.257
Reaktionspunkte
57
Hallo!
Ich hab vor, ein Programm zu schreiben, das mit Bits und Bytes umgehen soll. Hab auch gerade entdeckt, daß man einer Variablen Hex-Werte zuweisen kann. Manchmal ist es aber auch ganz angenehm, Binärzahlen zu haben. Gibt es eigentlich die Wertzuweisung und -ausgabe (s.u.) auch in binär?

Code:
[SIZE="3"][SIZE="2"][COLOR="Blue"]#include[/COLOR] <iostream>

[COLOR="Blue"]typedef unsigned char  byte[/COLOR];
[COLOR="blue"]typedef unsigned short word[/COLOR];

[COLOR="Blue"]int[/COLOR] main()
{
	[COLOR="blue"]using namespace[/COLOR] std;
	
	[COLOR="blue"]byte[/COLOR] a = 0x2F;

	cout.setf(ios::hex, ios::basefield);

	cout << "a = " << ([COLOR="blue"]int[/COLOR]) a << endl;

	[COLOR="blue"]return[/COLOR] 0;
}[/SIZE][/SIZE]
 
Schade, schade... :(

Hab mir jetzt als Notlösung diese Variante der Zuweisung überlegt:

Code:
[COLOR="Blue"]byte[/COLOR] b = bin8(0x00101111);

mit der Funktion

Code:
[COLOR="blue"]byte[/COLOR] bin8([COLOR="blue"]unsigned long[/COLOR] b)
{
	[COLOR="blue"]int[/COLOR] feld[]={1,2,4,8,16,32,64,128};
	[COLOR="blue"]int[/COLOR] dez = 0;

	[COLOR="blue"]for[/COLOR] ([COLOR="blue"]int[/COLOR] i = 7; i >= 0; i--)
		dez += b & (1 << 4*i) ? feld[i] : 0;

	[COLOR="blue"]return[/COLOR] dez;
}

Falls jemand eine bessere Lösung kennt, wird die natürlich gern genommen.
 
Darfs ein bisschen C sein? :hehehe:

Code:
long b = strtol("00101111",NULL, 2);

Return-Werte zu ignorieren ist natürlich nie eine gute Idee. :Oldno:


Wenn es eine reine C++-Lösung sein soll, lies dich mal in Bitsets ein.

Ich hab es jetzt nicht mehr ganz im Kopf, aber so in etwa müsste es gehen:

Code:
#include <iostream>
#include <bitset>

using namespace std;

int main() {

	string s("11001111");
	bitset<8> bs (s);

	cout << "Binaer: " << bs << endl;
	cout << "Dezimal: " << bs.to_ulong() << endl;

	return 0;
}
 
Es gibt auch in C die gerne vergessenen bitfields, der Mehrwert liegt aber im STL-Typ std::bitset

PHP:
#ifndef byte
#define byte unsigned char
#endif

typedef union _BYTE
{
	byte _b;

	struct
	{
		unsigned _0 :1; 
		unsigned _1 :1; 
		unsigned _2 :1; 
		unsigned _3 :1;
		unsigned _4 :1; 
		unsigned _5 :1; 
		unsigned _6 :1; 
		unsigned _7 :1;
	};
} BYTE;
 
Sehr interessant, danke für Eure Tips!
 
Zurück
Oben Unten