unsigned long long binär darstellen
-
Zum Glück gibt es ja auch noch ordentliche Referenzen. http://en.cppreference.com/w/cpp/utility/bitset/bitset
-
Dankeschön, wie sieht die Zahl denn in der Hexadezimaldarstellung aus. Ich glaub mit printf wird es mir nicht richtig ausgegeben.
-
#include <iostream> #include <vector> #include <type_traits> #include <iterator> #include <algorithm> template<typename Int, typename= typename std::enable_if<std::is_integral<Int>::value>::type> std::vector<bool> binaer(Int i) { std::size_t const bits = sizeof(Int) * CHAR_BIT; std::vector<bool> vec(bits); for( int a = bits - 1; a > -1 ; --a ) { vec[a] = i & 1; i >>= 1; } return vec; } int main() { std::vector<bool> vec = binaer(18446744073709551615ull); std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "") ); }
-
Dankeschön, wie sieht die Zahl denn in der Hexadezimaldarstellung aus.
Wahrscheinlich
0xFFFFFFFFFFFFFFFF
-
Namal schrieb:
Dankeschön, wie sieht die Zahl denn in der Hexadezimaldarstellung aus. Ich glaub mit printf wird es mir nicht richtig ausgegeben.
Da du dauernd von printf redest: Dir ist aber schon bekannt, dass die C++-Streams auch verschiedene Zahlenformate beherrschen?
-
SeppJ schrieb:
Namal schrieb:
Dankeschön, wie sieht die Zahl denn in der Hexadezimaldarstellung aus. Ich glaub mit printf wird es mir nicht richtig ausgegeben.
Da du dauernd von printf redest: Dir ist aber schon bekannt, dass die C++-Streams auch verschiedene Zahlenformate beherrschen?
std::cout << std::hex << ...
-
Ne, war mir nicht klar..Danke!
-
Ethon schrieb:
Hmm, laut http://www.cplusplus.com/...
cplusplus.com kannst du knicken, besonders was C++11 angeht. Leider erscheint es bei Google oft vor cppreference.com...
-
Hallo, also ich brauche diese Nummer um einen String darauf zu testen ob es ein Literal ist oder nicht, und jetzt habe ich ein Probleim bei den Ranges.
ulong valueOfDigit(char c){ ulong i; if(c>='0' && c<='9') i = c-'0'; if(c=='a' || c=='A') i = 10; if(c=='b' || c=='B') i = 11; if(c=='c' || c=='C') i = 12; if(c=='d' || c=='D') i = 13; if(c=='e' || c=='E') i = 14; if(c=='f' || c=='F') i = 15; return i; } bool overflowtest(string str, ulong basis){ ulong val=0; for(int i=0;i<str.length-1;++i){ if(str[i]!='_' && str[i]!='u' && str[i]!='U' && str[i]!='L'){ ulong digit = valueOfDigit(str[i]); if((ulong.max-digit)/basis<val) return false; else val=val*basis+digit; } } return true; } { assert(isIntegralLiteral("18_446_744_073_709_551_6151uL")==false); assert(isIntegralLiteral("0XFFFF_FFFF_FFFF_FFFF")==true); assert(isIntegralLiteral("0xfffffffffffffffe")==true); assert(isIntegralLiteral("0xfffffffffffffffeee")==false); // assert(isIntegralLiteral("0xfffffffffffffffee")==false); assert(isIntegralLiteral("0X1_0000_0000_0000_0000_")==false); assert(isIntegralLiteral("18_446_744_073_709_551_615uL")==true); assert(isIntegralLiteral("18_446_744_073_709_551_616uL")==false); assert(isIntegralLiteral("56563563563618_446_744_073_709_551_616uL")==false); assert(isIntegralLiteral("0b_1111_1111111111_1111111111_1111111111_1111111111_1111111111_1111111111Lu")==true); assert(isIntegralLiteral("0b_1111_1111111111_1111111111_1111111111_1111111111_1111111111_1111111111_1_Lu")==false); assert(isIntegralLiteral("0b_10000_0000000000_0000000000_0000000000_0000000000_0000000000_0000000000Lu")==false); }
Für dezimal und binär funktioniert es wunderbar, aber bei Hexadezimal habe ich ein problem..
Wenn ich also an diese ulong.max eine einz dazu addiere:
0X1_0000_0000_0000_0000_
erhalte ich ein false...wenn ich aber an den String noch irgendeine Zahl dranhänge("0xffffffffffffffffe")
dann erhalte ich ein truebei 2 zahlen dann aber wieder ein false. Woran kann das denn nun liegen?
EDIT: hab den Fehler gefunden, es ist die forschleife...ich derp
-
SeppJ schrieb:
Dir ist aber schon bekannt, dass die C++-Streams auch verschiedene Zahlenformate beherrschen?
"Verschiedene" ist schon fast eine Übertreibung, binär ist leider nicht darunter. Ich verwende dazu immer eine (leicht modifizierte) Implementierung von Dietmar Kühl: http://ideone.com/E5Fvnf
std::cout << bin << 18446744073709551615ull << std::endl;