unsigned long long binär darstellen



  • Hallo, ich möchte die Zahl 18446744073709551615 binär darstellen,
    mit printf lässt sie sich ja hexadezimal ausgeben, gibt es sowas auch für die binäre Darstellung?



  • Namal schrieb:

    Hallo, ich möchte die Zahl 18446744073709551615 binär darstellen,
    mit printf lässt sie sich ja hexadezimal ausgeben, gibt es sowas auch für die binäre Darstellung?

    Ähm, ist das nicht 1111..., also 64 Einsen?
    Würde cout<<"1111111111111111111111111111111111111111111111111111111111111111" benutzen.



  • gibt es sowas auch für die binäre Darstellung?

    Klar. Wie Nexus unten, mit C++11, oder was einfaches (s. u.).



  • Sone, nicht nur dass dein Code völlig realitätsfern ist, sondern er muss auch noch den Thread unnötig in die Länge und Breite (!) ziehen. Wenn du so viel Freizeit hast, warum machst du nicht mal was Sinnvolles? Es gäbe so viele Softwareprojekte, die man realisieren könnte...

    Namal:

    unsigned long long n = 18446744073709551615ull;
    std::bitset<64> bitset(n);
    
    std::cout << bitset.to_string() << std::endl;
    


  • Ich musste spontan würgen.



  • Ethon schrieb:

    Ich musste spontan würgen.

    Von der grundsätzlichen Nutzlosigkeit abgesehen ist der Code auch voller WTFs, wie ::std oder #define STREAM-INTEGRAL-MANAGER_HXX_INCLUDED ...



  • Daher ja auch: Für die lols. Das der Code völliger Blödsinn ist (war?), ist mir klar. 😃



  • Ich weiß nicht, wie ich darauf komme, aber i-wie erinnert mich dieser Thread an den, wo ich meinen ersten Beitrag hatte: http://www.c-plusplus.net/forum/307412
    Manche Menschen ändern sich nie. 🙄



  • Nexus schrieb:

    Sone, nicht nur dass dein Code völlig realitätsfern ist, sondern er muss auch noch den Thread unnötig in die Länge und Breite (!) ziehen. Wenn du so viel Freizeit hast, warum machst du nicht mal was Sinnvolles? Es gäbe so viele Softwareprojekte, die man realisieren könnte...

    Namal:

    unsigned long long n = 18446744073709551615ull;
    std::bitset<64> bitset(n);
    
    std::cout << bitset.to_string() << std::endl;
    

    Hmm, laut http://www.cplusplus.com/reference/bitset/bitset/bitset/ ist der Konstruktor

    bitset ( unsigned long val );
    

    , also funktioniert der Code zwar unter 64bit Linux/Unix (sizeof(long long) == sizeof(long)), nicht aber auf 32bit Systemen oder Win64.



  • 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


  • Mod

    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 true

    bei 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;
    

Log in to reply