jack: Bit-Operation

Hallo zusammen,

ich habe folgende Zeile gefunden:

input = input >> 4;

Leider wird diese Funktion ja nur unvollständig erklärt. Was ich weiß, ist das ich dadurch den Ganzteiligen Anteil bei einer Division durch 16 bekomme. Ich verstehe aber nicht warum. Kann mir da mal einer auf die Sprünge helfen.

Jack

  1. hallo,

    ich habe folgende Zeile gefunden:
    input = input >> 4;

    Oh. Möglicherweise hast du noch mehr Zeilen gefunden, die eventuell den Zusammenhang erklären?

    Leider wird diese Funktion ja nur unvollständig erklärt.

    Erstens ist das keine Funktion, und zweitens wird da überhaupt nichts erklärt.

    Was ich weiß, ist das ich dadurch den Ganzteiligen Anteil bei einer Division durch 16 bekomme.

    Woher weißt du das?

    Ich verstehe aber nicht warum. Kann mir da mal einer auf die Sprünge helfen.

    Ich fürchte, bei dieser Fragestellung kann das keiner wirklich, weil nicht klar ist, was das für eine ominöse "Zeile" sein soll. Im Internet, und auch in diversen Javascript-Funktionen, dürfte es etliche Millionen Zeilen geben, die man "finden" kann - konntest du keine besser verständliche Zeile finden?

    Eventuell hilft es dir weiter, mal in http://de.selfhtml.org/javascript/sprache/operatoren.htm#bits zu schauen,auch wenn du da mit der Anmerkung "Bit-Operatoren sind nur etwas für Profis" abgespeist wirst. Es hilft dir zumindest, zu verstehen, daß zur Klärung deiner Frage doch ein _bißchen_ mehr Information deinerseits erforderlich ist, was du mit dieser Zeile wo und warum anstellen möchtest.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Ich habe damit einen Int->Hex Umrechner hinbekommen, aber halt leider nicht ganz verstanden, warum er funktioniert. Hier der Code

      function calcHex(iNbr) {
       var hex = "0123456789ABCDEF";
       var sRes = "";
       while (iNbr != 0) {
        sRes = hex.charAt(iNbr%16) + sRes;
        iNbr = iNbr >> 4;
       }
       if (sRes=="") sRes="00";
       return sRes;
      }

      1. hi,

        Ich habe damit einen Int->Hex Umrechner hinbekommen, aber halt leider nicht ganz verstanden, warum er funktioniert.

        Schau dir mal an, was dir Martin geantwortet hat. Das hilft dir sicher weiter im Verständnis, und ist deutlich detalreicher, als es bisher in SELFHTML steht.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
      2. Ich habe damit einen Int->Hex Umrechner hinbekommen, aber halt leider nicht ganz verstanden, warum er funktioniert. Hier der Code

        function calcHex(iNbr) {
        var hex = "0123456789ABCDEF";
        var sRes = "";
        while (iNbr != 0) {
          sRes = hex.charAt(iNbr%16) + sRes;
          iNbr = iNbr >> 4;
        }
        if (sRes=="") sRes="00";
        return sRes;
        }

        erstmal warum jemand auf die Idee kommt statt zahl / 16 eine Bitoperation zu benutzen. Bitoperationen sind auf dem Computer die schnellsten Mathematischen Operationen die es gibt. Noch schneller als Additionen, im gegensatz dazu sind Fließkommazahlenberechnungen Saulangsam.
        Was früher, als die Rechner noch im MHz Bereich rechneten, u.U. sehr wichtig war (gerade für Grafikberechungen). Deshalb wird sowas noch heute gern benutzt, du siehst der Mensch hat langjährige Programmiererfahrung.

        Was passiert:

        Du kennst binäre Zahlen, eine 25 z.b. ist:

        0001 1010 wird diese um 1 Bit nach rechts verschoben dann:
        0000 1100 und eine eins plumpst hinten raus, die Zahl ist jetzt -> 12

        25 / 2 = 12 ( + 1)

        das ganze nochmal um eins nach rechts:
        0000 0110 eine null fällt weg -> 6

        12 / 2 = 6 ( + 0)

        Du hast also zweimal durch zwei geteilt, was das Gleiche wie eine Division durch vier ist:

        25 / 4 = 6 ( + 1 entspricht binär: 0001 )

        usw.

        Struppi.

        1. Hallo,

          Du kennst binäre Zahlen, eine 25 z.b. ist:
          0001 1010

          Eine 25 ist
          0001 1001

          Bei den ganzen Einsen und Nullen hat man sich schnell vertippt. Wollte nur verhindern, dass jemand der mit dem Kram nix anfangen kann, auch dein Beispiel nachvollziehen kann ;)

          Ansonsten hast du natürlich Recht.

          Viele Grüße
          Patrick

          --
          "Though this be madness, yet there's method in't."
          sh:( fo:| ch:? rl:( br:^ n4:( ie:{ mo:) va:} de:> zu:) fl:| js:( ss:| ls:[
          1. Du kennst binäre Zahlen, eine 25 z.b. ist:
            0001 1010

            Eine 25 ist
            0001 1001

            Oh Mann, ich hatte die ganze Zeit dran rumgespielt und wollte dann noch andere Aspekte einbauen und hab dann dreimal die Zahl geändert, hätte ich nicht tun sollen

            Ansonsten hast du natürlich Recht.

            Hoffentlich.

            Struppi.

  2. Hallo Jack,

    ich habe folgende Zeile gefunden:
    input = input >> 4;

    schön - ich hätte das sogar als
       input >>= 4;
    formuliert. Ist noch kürzer und kompakter. Aber das nur nebenbei.

    Was ich weiß, ist das ich dadurch den Ganzteiligen Anteil bei einer Division durch 16 bekomme. Ich verstehe aber nicht warum.

    Was macht denn der Operator ">>" ? Er schiebt alle Bits des Operanden nach rechts. Und eine Verschiebung um ein Bit nach rechts ist gleichbedeutend mit einer Division durch zwei, genauso wie im Dezimalsystem eine Verschiebung um eine Stelle nach rechts einer Division durch 10 entspricht.
    In deinem Beispiel wird der Wert nun nicht nur um eine Bitposition verschoben, sondern sogar um vier. Das entspricht also viermal hintereinander einer Division durch 2, insgesamt also 2^4=16.

    Kann mir da mal einer auf die Sprünge helfen.

    Befasse dich ein bisschen mit Binärarithmetik, wenn es dich wirklich näher interessiert.

    Schönen Abend noch,

    Martin

    --
    Du kannst dem Leben nicht mehr Tage geben.
    Aber dem Tag mehr Leben.
    1. hallo,

      input = input >> 4;
      schön - ich hätte das sogar als
         input >>= 4;
      formuliert. Ist noch kürzer und kompakter.

      Das ist es - aber es ist noch keine Funktion, sondern lediglich die Zuweisung eines Werts an eine Variable. "Aber das nur nebenbei".

      Befasse dich ein bisschen mit Binärarithmetik, wenn es dich wirklich näher interessiert.

      Es steht zu vermuten, daß das noch mehr Leute interessant finden könnten. Man sollte eventuell in molilys Thread anmerken, daß das Thema in SELFHTML durchaus genauer dargestellt werden könnte als bisher. Oder du schreibst gleich einen Artikel zu diesem Thema ...

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
      1. Hi Christoph,

        input >>= 4;
        Ist noch kürzer und kompakter.

        Das ist es - aber es ist noch keine Funktion, sondern lediglich die Zuweisung eines Werts an eine Variable. "Aber das nur nebenbei".

        Ich habe nie behauptet, dass es eine Funktion ist. Richtig, es ist eine Kurzform einer Zuweisung. Das mit der Funktion hatte Jack so formuliert, und ich habe es einfach stehenlassen.

        Befasse dich ein bisschen mit Binärarithmetik, wenn es dich wirklich näher interessiert.

        Es steht zu vermuten, daß das noch mehr Leute interessant finden könnten. Man sollte eventuell in molilys Thread anmerken, daß das Thema in SELFHTML durchaus genauer dargestellt werden könnte als bisher. Oder du schreibst gleich einen Artikel zu diesem Thema ...

        Über Integer- und Binärarithmetik? Auf welchem Niveau aufsetzen? Wie weit ins Detail gehen? Wer ist mein Ansprechpartner? Wahrscheinlich Mathias, wenn du schon so auf seinen Thread hinweist. Meinst du wirklich, das könnte ankommen?
        Gut, ich könnte mir wohl vorstellen, etwas Hilfreiches zu schreiben, zumal ich schon mehrmals hören durfte, dass ich anscheinend auch komplizierte Sachverhalte relativ leicht verständlich erklären könnte. Voraussetzung ist natürlich, dass ich sie selbst verstanden habe. ;-)

        Danke für den Denkanstoß, ich werd' ihn mal reifen lassen.
        So long,

        Martin

        --
        Wer morgens zerknittert aufsteht, hat den ganzen Tag Gelegenheit, sich zu entfalten.
        1. hallo Martin,

          Es steht zu vermuten, daß das noch mehr Leute interessant finden könnten. Man sollte eventuell in molilys Thread anmerken, daß das Thema in SELFHTML durchaus genauer dargestellt werden könnte als bisher. Oder du schreibst gleich einen Artikel zu diesem Thema ...
          Über Integer- und Binärarithmetik?

          Ja.

          Auf welchem Niveau aufsetzen?

          Keine Ahnung, da ich kein "Niveau" definieren könnte. Ich weiß aber - wenn auch kaum von Wortmeldungen hier aus dem Forum - daß es viele Leute gibt, die zwar sehr gründlich diverse Dokumentationen durchstöbern, aber bereits bei der Erwähnung der Existenz von "Fließkommazahlen" ganz einfach auf Durchgang schalten bzw. die entsprechenden Stellen überblättern oder weiterscrollen. Zum Grundverständnis, was man mit Binärarithmetik bewerkstelligen kann, hat Struppi weiter unten in diesem Thread etwas sehr Präzises ausgesagt, auch noch schön kurz und knapp und trotzdem verständlich.

          Wer ist mein Ansprechpartner? Wahrscheinlich Mathias, wenn du schon so auf seinen Thread hinweist.

          Mathias hat insbesondere bei SELFHTML 8.1.1 enorm viel für das gesamte riesige Javascript-Kapitel getan - auf eine Weise, die ich nie hätte erfüllen können (und das ist unter anderem einer der Vorteile, wenn man ein Redaktionsteam zusammenstellt, in dem jeder seine eigenen Prioritäten hat). Daß er mit seinem Thread bzw. im SELFHTML-Blog das Thema "sinnvoller Einsatz von Javascript" angestoßen hat, war nur folgerichtig. Mit Sicherheit ist er ein kenntnisreicher Ansprechpartner.

          Meinst du wirklich, das könnte ankommen?

          Ja, davon bin ich ziemlich überzeugt. Integer- und Binärarithmetik kommt allerdings nicht nur in/bei Javascript vor, das gehört zu den Dingen, die auch von Perl, PHP, Python ... und natürlich auch von den "grundlegenden" Sprachkonstrukten wie C/C++ beherrscht wird. Es ist ein "sprachenübergreifendes" Thema, das man allerdings (wahrscheinlich) nur an einer Sprache mal zu demonstrieren braucht.

          Gut, ich könnte mir wohl vorstellen, etwas Hilfreiches zu schreiben, zumal ich schon mehrmals hören durfte, dass ich anscheinend auch komplizierte Sachverhalte relativ leicht verständlich erklären könnte.

          Ich kann ja Korrektur lesen *g*

          Danke für den Denkanstoß, ich werd' ihn mal reifen lassen.

          Es war durchaus ernst gemeint. Das von Jack angestoßene Thema kommt selten hier im Forum vor, ist aber meines Erachtens nicht ganz unwichtig - und es hätte ihm in nahezu jeder anderen Sprache auch begegnen können.

          Grüße aus Berlin

          Christoph S.

          --
          Visitenkarte
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
          1. Hi Christoph,

            Auf welchem Niveau aufsetzen?
            Keine Ahnung, da ich kein "Niveau" definieren könnte.

            ... zumal ohne bestimmte "Zielgruppen" damit vor den Kopf zu stoßen, ich weiß. Das festzulegen, erfordert viel Fingerspitzengefühl und die Bereitschaft, auch mal ab und zu in ein Fettnäpfchen zu treten.
            Beispiel: Das EMV-Prüflabor, in dem ich arbeite, zeigt unser Geschäftsführer immer wieder gern auch (potentiellen) Kunden, Lieferanten, sonstigen Partnern. Wenn er dann mit zwei, drei mir völlig unbekannten [evtl. ausländischen] Schlipsträgern ankommt und sagt, "Herr Kunkel, könnten Sie uns ganz kurz erläutern, worum es hier geht. [Mit Rücksicht auf unsere Gäste bitte in Englisch?]", dann ist normalerweise meine erste Gegenfrage an die Gäste, "Sind Sie eher aus dem technischen oder aus dem kaufmännischen Bereich?" So habe ich wenigstens einen ungefähren Ansatzpunkt.

            Ich weiß aber - wenn auch kaum von Wortmeldungen hier aus dem Forum - daß es viele Leute gibt, [...] überblättern oder weiterscrollen.

            Ja, das kenne ich. Techniken anwenden, ohne sie wirklich zu kennen, und dann bei der Erwähnung dazugehöriger Fachbegriffe erschrocken zusammenzucken.

            Zum Grundverständnis, was man mit Binärarithmetik bewerkstelligen kann, hat Struppi weiter unten in diesem Thread etwas sehr Präzises ausgesagt, auch noch schön kurz und knapp und trotzdem verständlich.

            Stimmt. Kurz und bündig, aber auch sehr blumig und nachvollziehbar.

            Mathias hat [...] Mit Sicherheit ist er ein kenntnisreicher Ansprechpartner.

            Okay, falls er nicht _zufällig_ hier mitliest und darauf reagiert, werde ich ihn mal drauf ansprechen. Aber heute sicher nicht mehr. ;-)

            Ja, davon bin ich ziemlich überzeugt. Integer- und Binärarithmetik kommt allerdings nicht nur in/bei Javascript vor, ...

            Ich hatte eben in Gedanken schon ein paar Bauklötze zusammengestellt, und es war mir klar, dass so ein Grundlagenthema eine Menge Querverweise zu anderen Programmiersprachen haben könnte. Von denen, die du erwähnst, sind mir allerdings nur PHP und C/C++ vertraut.

            Ich kann ja Korrektur lesen *g*

            Okay, is' notiert.  <check/>
            Danke für die ermutigenden Worte & gute Nacht... oder so...

            Martin

            --
            Wer schläft, sündigt nicht.
            Wer vorher sündigt, schläft besser.