binäre Zahlen darstellen
-
Hallo!
Ich arbeite hier seit Freitag Nachmittag an meinem CPUID-Projekt. Es funktioniert auch alles perfekt. Nur jetzt muss ich bei der Bestimmung der AMD Athlon64er CPUs binäre Zahren darstellen.
Ich weiß bereits, dass 0xXXXX hexadezimale Zahlen sind, aber wie schreibt man binäre Zahlen?MfG
Nachtaktiver
-
um die Bits eines chars oder ints auszugeben, kannst du folgendes tun:
char c = 0x36; std::cout << c << ':' << std::setw(2) << '\t'; for (int i = 7; i >= 0; i--) //High-bit zu Low-bit std::cout << (c >> i & 1); int a = 1000; std::cout << '\n' << a << ':' << std::setw(2) << '\t'; for (i = 31; i >= 0; i--) std::cout << (a >> i & 1);
-
Shlo schrieb:
um die Bits eines chars oder ints auszugeben, kannst du folgendes tun:
char c = 0x36; std::cout << c << ':' << std::setw(2) << '\t'; for (int i = 7; i >= 0; i--) //High-bit zu Low-bit std::cout << (c >> i & 1); int a = 1000; std::cout << '\n' << a << ':' << std::setw(2) << '\t'; for (i = 31; i >= 0; i--) std::cout << (a >> i & 1);
Du könntest natürlich auch fortgesetzte Division betreiben. Das sieht zwar nicht so freaky aus, aber ist lesbarer und die meisten modernen Compiler machen daraus auch Bitschiebeoprationen.
#include <sstream> using namespace std; string erzeugeBinaerzahl(long t) { stringstream os; if(t < 0) { os << '-'; t = -t; } while(t) { os << t % 2; t /= 2; } return os.str(); }
-
Leute, das meine ich nicht.
Ich meine wie ich Binärzahlen in meinem C++-Code darstellen kann.
Wenn ich
int bin_zahl = 100101110101000111000011011101;
schreibe ist es ja noch lange keine Binärzahl.
-
Es wird eh alles binär dargestellt und wenn du von binär nach dezimal willst, dann streng mal deine Birne an!
-
Das geht imho nicht in c++ . du müsstest dir entweder eine funktion schreiben, die
dir einen string a la "1001110100101" in einen int wandelt, oder schreib es als hex-zahl,
alsoint a = 0x6a78f90d;
kann man sogar fast schon im kopf rechnen, da immer 4 stellen einer binärzahl eine stelle der
hexzahl ausmachen.int bin_zahl = 1001 0111 0101 0001 1100 0011 0111;
entspricht dann
int hex_zahl = 0x9751c3b;
-
EDIT: hat sich erledigt
-
EDIT: hat sich erledigt, sorry
-
Geht leider nicht direkt. Aus Langeweile ist mal das hier entstanden:
#include <iostream> using namespace std; template<unsigned long long val> struct bin_num { static const unsigned value = bin_num<val / 10>::value * 2 + val % 10; }; template<> struct bin_num<0> { static const unsigned value = 0; }; int main() { cout << bin_num<10100111001>::value << endl; cin.get(); }
Allerdings ist das schon alleine wegen "long long" und der Rekursionstiefe nicht portabel, und selbst mit "long long" kriegt man noch keine sehr großen Zahlen dargestellt. Wenn man bin_num<byte1, byte2, byte3, byte4> draus machen würde, wäre man aber auch diese Probleme los - 100% effizient und wunderbar freakig!
(Wenn es die olle oktale Notation nicht gäbe, müsste man auch nicht aufpassen, bin_num<0101010> zu schreiben - was natürlich nicht die erwartete Zahl wäre...)
(*editierwahn*)
-
Ein einfacher oktalzahlsicher Weg:
#include <iostream> #include <stdlib.h> #include <string.h> using namespace std; int bin(string str) { int num = 0; for (int i = 0; i < str.length(); i++) num = num + (str[i] - 0x30) * pow((double)2, (double)(str.length() - i - 1)); return num; } int main(int argc, char *argv[]) { cout << bin("01101"); // 13 return 0; }
-
mastercpp schrieb:
Ein einfacher oktalzahlsicher Weg:
#include <iostream> #include <stdlib.h> #include <string.h> using namespace std; int bin(string str) { int num = 0; for (int i = 0; i < str.length(); i++) num = num + (str[i] - 0x30) * pow((double)2, (double)(str.length() - i - 1)); return num; } int main(int argc, char *argv[]) { cout << bin("01101"); // 13 return 0; }
Warum schreibst du eigentlich 0x30 anstelle von '0'? Soll das cool sein? Wo doch '0' so viel portabler ist. Würde dann sogar bei mir auf der Arbeit mit den coolen EBCDIC-Hobeln laufen. Und pow ist eigentlich auch unnötig. Man kann zwar größere Zahlen bearbeiten, doch beim Rückfall auf int geht eh alles flöten.
-
unterstützen manche compiler nicht ein "0b1100100" ähnlich dem "0xFF" und der oktalen eingabe?
-
tobidope schrieb:
Warum schreibst du eigentlich 0x30 anstelle von '0'? Soll das cool sein? Wo doch '0' so viel portabler ist. Würde dann sogar bei mir auf der Arbeit mit den coolen EBCDIC-Hobeln laufen.
Ich hab in dem Moment nicht dran gedacht, dass ich auch '0' hätte schreiben können. (War schon spät)
tobidope schrieb:
Und pow ist eigentlich auch unnötig. Man kann zwar größere Zahlen bearbeiten, doch beim Rückfall auf int geht eh alles flöten.
Was soll man außer pow nehmen?
-
mastercpp schrieb:
tobidope schrieb:
Warum schreibst du eigentlich 0x30 anstelle von '0'? Soll das cool sein? Wo doch '0' so viel portabler ist. Würde dann sogar bei mir auf der Arbeit mit den coolen EBCDIC-Hobeln laufen.
Ich hab in dem Moment nicht dran gedacht, dass ich auch '0' hätte schreiben können. (War schon spät)
tobidope schrieb:
Und pow ist eigentlich auch unnötig. Man kann zwar größere Zahlen bearbeiten, doch beim Rückfall auf int geht eh alles flöten.
Was soll man außer pow nehmen?
2 hoch x ist äquivalent zu
unsigned long potenz = 1ul << x;
Hoffe ich mal, ist nämlich jetzt auch spät