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


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

Anmelden zum Antworten