Ziffern char array in bitkette



  • Moin,
    ich grübel jetzt seit geraumer Zeit nach, wie ich am Besten ein (quasi beliebig) langes Char Array mit Zeichen drin ( "193294824829849849384398438" ) in ein bytearray in binärschreibweise bekomme, das Ganze ist für eine BigInt Klasse mit beliebig großen Zahlen gedacht.
    also "10" soll beispielsweise in b1=00001010, "511" in b1=00000001 b2=11111111 usw, nur eben auch für weit größere Zahlen.
    Alle Ansätze die ich versucht habe, haben das Problem, dass irgendwelche Rechenwerte irgendwann zu groß werden...
    Hat da vielleicht jemand eine erleuchtende Idee?



  • char ziff[5]="1234";
    

    ziff[0] => 00000001
    ziff[1] => 00000010
    ziff[2] => 00000011
    ziff[3] => 00000100

    long z = *((long*)ziff);
    

    z => 00000001000000100000001100000100

    entspricht = 16909060



  • BorisDieKlinge schrieb:

    char ziff[5]="1234";
    

    entspricht = 16909060

    Und ich denke, genau das wollte er nicht 😉

    Ich glaube da gibt's sowas wie das Horner-Schema, damit kannst du es halbwegs easy umwandeln:

    const string text = "193294824829849849384398438";
    const unsigned int input_base = 10;
    
    MeineGroßeZahl n = text[0] - '0';
    for ( string::const_iterator textIter=text.begin()+1; textIter!=text.end(); textIter++ )
    {
        n *= input_base;
        n += *textIter - '0';
    }
    

    Ist halt nur nicht so schnell, weiß aber auch nicht, ob's schneller geht 😕



  • gibts dafür nicht was in der STL(bitset)?



  • du brauchst ein array, das groß genug ist, deine einsen und nullen zu speichern



  • Naja mein Problem war ja, irgendwann zu große Zwischenvariablen zu haben mit dem Hornerschema... aber im Grunde hatte ich da nur ne Denkblockade, weil ich immer mit irgendwelchen Zwischenvariablen statt direkt arbeiten wollte, die dann zu groß wurden.
    So wie Badestrand es hatte ist es schon richtig, auch wenn ich den Post leider jetzt erst sehe umpf aber dennoch danke ^^

    Naja, meine (zwangsweise Java-)Version sieht dann so aus:

    private byte[] to_nums(String vals)
    	{
    		byte radix = 10; // 10 ersystem
    		ByteBigInt retval = new ByteBigInt((byte)0);
    
    		byte[] as_bytes = vals.getBytes();
    
    		for(int i = 0; i < vals.length(); i++)
    			as_bytes[i] = (byte) (as_bytes[i]-0x30);
    
    		for(int i = as_bytes.length-1; i >= 0 ; i--)
    		{
    		  retval.bytes = retval._add(retval.bytes, to_byte_arr(as_bytes[as_bytes.length-i-1]));  // stelle Addieren, von rechts anfangen
    		  if(i!=0)
    		  {
    		    retval.bytes = retval._multi(retval.bytes, to_byte_arr(radix));  // und mal radix, Zehnersysten *10
    		  }
    		}
    
    	    return retval.bytes;
    	}
    


  • und wo ist da jetzt der clou ?
    von welchem typ haben ByteBigInt, bzw. MeineGroßeZahl ?
    😉


Anmelden zum Antworten