hotti: Wieviel Bit braucht eine integer Zahl

hi,

siehe Thema. Beispiel 15: das sehe ich sofort, die braucht 4 Bit. Aber was ist mit "beliebigen" Zahlen (mit max 32 Bit), muss ich da eine Schleife bauen oder geht das vielleicht auch ein bischen zackiger?

Vorzugsweise in Perl...

Viele Grüße,
Horst

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. Hallo hotti,

    mit einer n-Bit-Zahl kannst du 2^n verschiedene Zahlen darstellen. Du benötigst also den 2er-Logarithmus

    Gruß, Jürgen

    1. mit einer n-Bit-Zahl kannst du 2^n verschiedene Zahlen darstellen. Du benötigst also den 2er-Logarithmus

      Gehört es zur Definition "integer", dass ein Bit das Vorzeichen darstellt?

      Kalle

      1. Hello,

        mit einer n-Bit-Zahl kannst du 2^n verschiedene Zahlen darstellen. Du benötigst also den 2er-Logarithmus

        Gehört es zur Definition "integer", dass ein Bit das Vorzeichen darstellt?

        Kommt auf die Plattform an.
        Es gibt so verrückte OS, bei denen negative Zahlen in einem zusätzlichen Byte signiert werden und in der Speicherstelle nur der absolute Wert steht.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      2. Hallo Kalle_B,

        Gehört es zur Definition "integer", dass ein Bit das Vorzeichen darstellt?

        je nach Sprache gibt es auch signed und unsigned Integer. Aber beiden gemein ist, dass es 2^n verschiedene Zahlen gibt:

        0 ... 2^n-1      (0 ... 15)

        • 2^(n-1) ... 2^(n-1)-1  (-8 ... 7)

        Gruß, Jürgen

  2. siehe Thema. Beispiel 15: das sehe ich sofort, die braucht 4 Bit. Aber was ist mit "beliebigen" Zahlen (mit max 32 Bit), muss ich da eine Schleife bauen oder geht das vielleicht auch ein bischen zackiger?

    wie wärs mit eine logarithmischen Funktion auf der Basis von 2

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
  3. @@hotti:

    nuqneH

    siehe Thema. Beispiel 15: das sehe ich sofort, die braucht 4 Bit. Aber was ist mit "beliebigen" Zahlen (mit max 32 Bit), muss ich da eine Schleife bauen oder geht das vielleicht auch ein bischen zackiger?

    Wieviel Stellen braucht denn 42 im Dezimalsystem? Ab welcher Zahl benötigst du eine Stelle mehr? Ab der nächsten Zehnerpotenz: 100 = 10² benötigt 3 = 2 + 1 Stellen. Jede Zahl m · 10² mit 1 ≤ m < 10 benötigt 3 Stellen.

    Allgemein: eine Zahl a = m · 10ⁿ mit 1 ≤ m < 10 benötigt n + 1 Stellen. Wie kommt man nun an n, wenn a gegeben ist? Beide Seiten logarithmieren:

    lg a = lg m + n
       n = lg a - lg m

    Wegen 1 ≤ m < 10 ist 0 ≤ lg m < 1. Also

    n = floor(lg a)

    Wenn du die Stellenanzahl jetzt nicht fürs Dezimalsystem, sondern fürs Dualsystem haben willst, ist die Überlegung dieselbe. Nur anstatt der Basis 10 die Basis 2, folglich anstatt der Zehnerlogarithmus den Logarithmus zur Basis 2.

    Qapla'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)
  4. hi,

    vielen Dank für eure Bemühungen!

    Logarithmus2 - ja klar. Wenn ich eine fertige Funktion nehme (c oder Perl, log()), ists jedoch so, dass da ein float zurückgegeben wird, den ich noch zu int casten und eins dazuzählen muss. Also doch lieber gleich eine Schleife über 32 Bit? Ich hab das mal gegenübergestellt (Perl):

      
    my $zahl = 8;  
      
    printf("%d %08b %d\n", bitcount($zahl), $zahl, log2($zahl)+1);  
      
    sub bitcount{  
    	my $n = shift || return 0;  
    	  
    	my $pos = 0;  
    	for(my $i = 0; $i < 32; $i++){  
    		my $bit = ($n >> $i) & 1;  
    		if($bit){  
    			$pos = $i;  
    		}  
    	}  
    	return ++$pos;	  
    }  
      
      
    sub log2{  
    	my $n = shift || return 0;  
    	return log($n)/log(2);  
    }  
    
    

    Hotte

    --
    Nette Spielerei für verregnete Tage...
    1. for(my $i = 0; $i < 32; $i++){

      Du hast in letzter Zeit zuviel in C programmiert?

      for my $i(0..31) {

      Zum testen welche Funktion schneller ist use Benchmark;

      Struppi.

      1. hi Struppi,

        Zum testen welche Funktion schneller ist use Benchmark;

        Genau ;)
        In meinem Alter muss alles schnell gehen, hab keine Zeit...

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    2. Hi hotti!

      Logarithmus2 - ja klar. Wenn ich eine fertige Funktion nehme (c oder Perl, log()), ists jedoch so, dass da ein float zurückgegeben wird, den ich noch zu int casten und eins dazuzählen muss.

      Das liefert falsche Ergebnisse.

      Mathematisch richtig wäre folgender Term:
      [latex]n = \lceil log_2{x} \rceil[/latex]
      Wobei n die Anzahl der Stellen im Dualsystem ist, die eine Zahl x im Dezimalsystem benötigt.

      MfG H☼psel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      1. @@Hopsel:

        nuqneH

        »» Logarithmus2 - ja klar. Wenn ich eine fertige Funktion nehme (c oder Perl, log()), ists jedoch so, dass da ein float zurückgegeben wird, den ich noch zu int casten und eins dazuzählen muss.
        Das liefert falsche Ergebnisse.

        Mathematisch richtig wäre folgender Term:
        [latex]n = \lceil log_2{x} \rceil[/latex]

        Das liefert falsche Ergebnisse.

        Mathematisch richtig wäre folgender Term:
        [latex]n = \lfloor log_2{x} \rfloor + 1[/latex]

        Wie hotti sagte. Sonst stimmt’s für die Zweierpotenzen nicht.

        Qapla'

        --
        Bildung lässt sich nicht downloaden. (Günther Jauch)
        1. Hi Gunnar!

          Mathematisch richtig wäre folgender Term:
          [latex]n = \lfloor log_2{x} \rfloor + 1[/latex]

          Wie hotti sagte. Sonst stimmt’s für die Zweierpotenzen nicht.

          Ohja, Denkfehler meinerseits.

          MfG H☼psel

          --
          "It's amazing I won. I was running against peace, prosperity, and incumbency."
          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      2. Hi Hopsel,

        Wobei n die Anzahl der Stellen im Dualsystem ist, die eine Zahl x im Dezimalsystem benötigt.

        ^^^^^^^^^^^^^                      ^^^^^^^^^^^^^^^^

        ???

        viele Gruesse,
        der Bademeister

        1. @@Bademeister:

          nuqneH

          »» Wobei n die Anzahl der Stellen im Dualsystem ist, die eine Zahl x im Dezimalsystem benötigt.
                                            ^^^^^^^^^^^^^                      ^^^^^^^^^^^^^^^^

          ???

          „im Dezimalsystem“ war zuviel. Die Zahl x (deren Wert) ist völlig unabhängig davon, in welchem Zahlensystem sie dargestellt wird.

          Qapla'

          --
          Bildung lässt sich nicht downloaden. (Günther Jauch)
        2. Hi Bademeister!

          Wobei n die Anzahl der Stellen im Dualsystem ist, die eine Zahl x im Dezimalsystem benötigt.
                                            ^^^^^^^^^^^^^                      ^^^^^^^^^^^^^^^^

          ???

          War sowieso falsch, weil ich nicht genauer darüber nachgedacht habe.

          Aber für dich nochmal der Satz mit richtiger Antwort:
          [latex]n = \lfloor log_2{x} \rfloor + 1[/latex]
          n ist die Anzahl der Stellen im Binärsystem, die eine Zahl x, angegeben im Dezimalsystem, benötigt.

          MfG H☼psel

          --
          "It's amazing I won. I was running against peace, prosperity, and incumbency."
          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
          1. @@Hopsel:

            nuqneH

            n ist die Anzahl der Stellen im Binärsystem, die eine Zahl x, angegeben im Dezimalsystem, benötigt.

            Nein. n hängt nicht davon ab, ob x als 42 oder XLII oder "zwieundvierzig" oder ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ││ angegeben wird.

            Qapla'

            --
            Bildung lässt sich nicht downloaden. (Günther Jauch)
            1. Hi Gunnar!

              n ist die Anzahl der Stellen im Binärsystem, die eine Zahl x, angegeben im Dezimalsystem, benötigt.

              Nein. n hängt nicht davon ab, ob x als 42 oder XLII oder "zwieundvierzig" oder ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ┼┼┼┼ ││ angegeben wird.

              Ja, ich weiß. Erst komme ich mit einer mathematischen Definition an und dann versau´ ich alles wieder durch eine falsche Ausdrucksweise.

              Zu meiner Verteidigung: Die meisten Programmiersprachen erkennen "zwieundvierzig" und "XLII" nicht als Zahl. :-P

              MfG H☼psel

              --
              "It's amazing I won. I was running against peace, prosperity, and incumbency."
              George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
              Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    3. Moin.

      sub bitcount{

      [...]
      }

        
      Das geht einfacher (ungetestet):  
      ~~~perl
        
      sub bitcount {  
      	my $n = shift || return 0;  
      	my $msb = 0;  
        
      	for(; $n; $n >>= 1)  
      		++$msb;  
        
      	return $msb;  
      }
      

      Christoph

      1. Moin.

        Das geht einfacher (ungetestet):

        Getestet, geht, vielen Dank!

        Was genau macht

        ;$n >>= 1 # cool

        das da:?
        my $bit = ($n >> $i) & 1;
        if($bit){}

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
        1. Hi hotti!

          Was genau macht
          ;$n >>= 1 # cool

          Das ist die Kurzschreibweise von $n = $n >> 1;.

          das da:?
          my $bit = ($n >> $i) & 1;
          if($bit){}

          Nein.
          Die Abbruchbedingung der For-Schleife, die du hier mit "if($bit)" beschreibst, steht im Kopf eben dieser Schleife:
          for(;$n;$n>>=1);
          Solange (bool)$n wahr ist, wird der Rumpf ausgeführt und danach $n durch 2 dividiert (Integerdivision).

          MfG H☼psel

          --
          "It's amazing I won. I was running against peace, prosperity, and incumbency."
          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      2. Moin.

        » ~~~perl

        sub bitcount{

        » [...]
        » }

        
        >   
        > Das geht einfacher (ungetestet):  
          
        Oder:  
        ~~~perl
        sub bitcount {  
                my $n = shift || return 0;  
                my $msb = 1;  
                ++$msb while($n >>= 1);  
                return $msb;  
        }
        

        Struppi.

  5. Hello,

    siehe Thema. Beispiel 15: das sehe ich sofort, die braucht 4 Bit. Aber was ist mit "beliebigen" Zahlen (mit max 32 Bit), muss ich da eine Schleife bauen oder geht das vielleicht auch ein bischen zackiger?

    Also, je länger ich mir diesen Thread anschaue, desto mehr frage ich mich:

    Wieviel Bit braucht ein Programmierer, damit er sich heute noch solche Fragen stellt?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom,

      Also, je länger ich mir diesen Thread anschaue, desto mehr frage ich mich:
      Wieviel Bit braucht ein Programmierer, damit er sich heute noch solche Fragen stellt?

      hmm, ich hab' zur Zeit ein Bit (0,33) vor mir und noch ein paar im Keller - aber diese Frage war für mich schon seit Jahrzehnten beantwortet :D

      Freundliche Grüße

      Vinzenz

      1. Hello Vinzenz,

        Also, je länger ich mir diesen Thread anschaue, desto mehr frage ich mich:
        Wieviel Bit braucht ein Programmierer, damit er sich heute noch solche Fragen stellt?

        hmm, ich hab' zur Zeit ein Bit (0,33) vor mir und noch ein paar im Keller - aber diese Frage war für mich schon seit Jahrzehnten beantwortet :D

        Na, sag ich doch.
        Ich hole mir jetzt aber lieber noch ein Weißbier. Bits vertrag ich heute nicht mehr :-)

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
    2. hi Tom,

      Wieviel Bit braucht ein Programmierer, damit er sich heute noch solche Fragen stellt?

      Die Antwort fand ich vorn paar Jahren im Lenzenhaus / Eifel:

      1. Bit: Ich denke darüber nach, den Urlaub abzubrechen, komische Plörre
      2. Bit: Naja...
      3. Bit: gehe pinkeln.
      4. Bit: wo hab ich denn den Wodka hingetan?
      5. Bit: Wodka gefunden.
      6. Bit: Irgendwie schmeckt der Wodka nach Hefe.
      7. Bit: siehe 3.
      8. Bit: Meine Frau gibt mir ein Glas für den Wodka.
      9. Bit: das zweite Byte ist wie angefressen
      10. Bit: siehe 3.
      11. Bit: Fernseher angemacht
      12. Bit: mal wieder raus, Katze gestreichelt
      13. Bit: Tooooooooooooooooooooor!
      14. Bit: Meine Frau sagt, brüll nur, hört sowieso keiner hier
      15. - 20. Bit: langweiliges Spiel, ich gehe öfter raus und streichele die Katzen, mittlerweile sind es zwei die wie Zwillinge aussehen
      21. - 24. Bit: Schön hier
      25. Bit: Kasten ist leer, Wodka ist alle.

      Nächster Tag: Ich wundere mich über die vielen DAU's die mit dem Auto rumfahren.

      Hotte

      --
      Der Urlaub im Lenzenhaus war wunderbar.