MB: Bit Operatoren

nabend Community,

was für einen Sinn macht es in Skripsprachen, und nicht in maschinen nahe Hochsprachen, Bit-Operatoren zu verwenden?

Kurze und Knappe Frage.

vlg MB

  1. Hallo,

    was für einen Sinn macht es in Skripsprachen, und nicht in maschinen nahe Hochsprachen, Bit-Operatoren zu verwenden?

    auch in einigen Scriptsprachen werden gelegentlich boolsche Informationen, die zum gleichen Thema gehören, in bit-codierten Werten zusammengefasst. Denke beispielsweise an error_reporting in PHP.

    Aber auch für den Nutzer einer Scriptsprache ist es hin und wieder sinnvoll, solche boolschen Informationen zusammenzufassen. Denn dann kann man nicht nur einzelne Flags abfragen, sondern auch Kombinationen.

    Übrigens ist die Bezeichnung "maschinennahe Hochsprachen" zumindest interessant, teilweise sogar ein Widerspruch.

    So long,
     Martin

    --
    Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
    - Douglas Adams, The Hitchhiker's Guide To The Galaxy
    1. Hallo Martin,

      auch in einigen Scriptsprachen werden gelegentlich boolsche Informationen, die zum gleichen Thema gehören, in bit-codierten Werten zusammengefasst. Denke beispielsweise an error_reporting in PHP.

      Aber auch für den Nutzer einer Scriptsprache ist es hin und wieder sinnvoll, solche boolschen Informationen zusammenzufassen. Denn dann kann man nicht nur einzelne Flags abfragen, sondern auch Kombinationen.

      kannst du mir mehr erzählen? Ich finde den Bezug zu Bit-Operatoren nicht.

      Übrigens ist die Bezeichnung "maschinennahe Hochsprachen" zumindest interessant, teilweise sogar ein Widerspruch.

      "Maschinennahe Programmierung in C" Das ist doch ein feststehender Begriff in der Informatik oder irre ich mich?

      vlg MB

      1. @@MB

        Aber auch für den Nutzer einer Scriptsprache ist es hin und wieder sinnvoll, solche boolschen Informationen zusammenzufassen. Denn dann kann man nicht nur einzelne Flags abfragen, sondern auch Kombinationen.

        kannst du mir mehr erzählen? Ich finde den Bezug zu Bit-Operatoren nicht.

        Du hast bspw. 8 Flags (d.h. 8 Bits) in einer Variablen a (durchgezählt 76543210). Jetzt willst du das 0. (das niederwertigste) und das 3. Bit auf 1 setzen. Machst du so:

        a = a | 0b00001001;
        

        Oder das 2. und 4. Bit auf 0 setzen:

        a = a & 0b11101011;
        

        Beides lässt sich auch kürzer schreiben:

        a |= 0b00001001;
        a &= 0b11101011;
        

        Abfragen, ob das 7. (das höherwertigste) Bit gesetzt ist:

        if (a & 0b10000000)
        

        LLAP 🖖

        --
        “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
        Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
        1. Hallo Gunnar,

          schönes anwendungsbeispiel. das habe ich vermisst. danke dafür

          vlg MB

  2. Tach!

    was für einen Sinn macht es in Skripsprachen, und nicht in maschinen nahe Hochsprachen, Bit-Operatoren zu verwenden?

    Sie haben den Sinn, dass jemand mit einem Problem, für dessen Lösung sie erforderlich sind, sie verwenden kann.

    Die Frage hätte wohl eher lauten sollen: Wofür werden Bit-Operationen verwendet? Nun, beispielsweise um mathematisch-informatische Aufgaben zu lösen, etwa cryptographische Algorithmen.

    dedlfix.

    1. Hallo dedlfix,

      Die Frage hätte wohl eher lauten sollen: Wofür werden Bit-Operationen verwendet?

      Jo hätte ich und das wäre implizit die Frage gewesen. Sorry für das Missverständnis

      Nun, beispielsweise um mathematisch-informatische Aufgaben zu lösen, etwa cryptographische Algorithmen.

      Macht Sinn, doch ich weis das Skriptsprachen sehr weit von der maschinennahen Programmierung entfernt sind und es viel Zeit frist diese Bitweisen Operatoren "anzusprechen?" hat man mir gesagt und es auch Sinn ergibt.

      Und ok habe ich garnich weitergedacht. Kryptografie sollte man doch in chips verwenden zumindest Symmetrische Kryptografie und das soll sehr viel schneller sein als in Skriptsprachen programmiert. Asymmetrische Kryptografe mag mit sicherheit in Hochsprachen programmiert sein da die "höheren" Rechenoperatoren wie modulo und potenzen - wenn ich mich recht entsinne - in anspruch genommen werden und das nicht so einfach in XOR-Verknüpfungen zu realisieren ist - Ich hoffe ich hab richtig aufgepasst. Außerdem wirst du das sehr viel mehr entschieden besser wissen.

      vlg MB

      1. Tach!

        Macht Sinn, doch ich weis das Skriptsprachen sehr weit von der maschinennahen Programmierung entfernt sind und es viel Zeit frist diese Bitweisen Operatoren "anzusprechen?" hat man mir gesagt und es auch Sinn ergibt.

        Nicht alle Anwendungsfälle brauchen eine hohe Ausführungsgeschwindigkeit.

        Und ok habe ich garnich weitergedacht. Kryptografie [...]

        Zu den kryptographischen Algorithmen zählen auch solche, die einen Hash berechnen. Es geht nicht immer nur darum, etwas reversibel und hochsicher und sehr rechenintensiv zu verschlüsseln.

        Außerdem wirst du das sehr viel mehr entschieden besser wissen.

        Nein, überhaupt nicht. Ich weiß grad mal wonach ich suchen muss, um eine Anleitung für die Erstellung eines SSH-Schlüsselpaares oder eines (selbst signierten) Zertifikats zu finden.

        dedlfix.

      2. und es viel Zeit frist diese Bitweisen Operatoren "anzusprechen?" hat man mir gesagt und es auch Sinn ergibt.

        Was für einen Sinn ergibt das? Die sind genauso schnell "angesprochen" wie andere Operationen.

        Und ok habe ich garnich weitergedacht. Kryptografie sollte man doch in chips verwenden

        Tja die Praxis erlaubt nunmal nicht immer dass man überall direkt einen Chip einbaut wo man sowas braucht :-)

        Ich hoffe ich hab richtig aufgepasst.

        Vor allem solltest du nicht alles sofort glauben was "man" dir sagt ;-)

        1. Hallo encoder,

          und es viel Zeit frist diese Bitweisen Operatoren "anzusprechen?" hat man mir gesagt und es auch Sinn ergibt. Was für einen Sinn ergibt das? Die sind genauso schnell "angesprochen" wie andere Operationen.

          Ich glaube du weist sehr wohl das einfache Negierungen eines Bits oder XOR-Verknüpfungen ein bissl schneller sind als zb sinus, exponenzial funktionen oder modulo berechnungen. Außerdem kann man das gut in Hardware implementieren, genauso wie XOR-Verknüpfungen usw. Und ich habe keine ahnung wie viel zig operationen nötig sind um den Nährungswert von der Taylor-Reihe zu berechnen. Es sollten viele sein. Wenn ich dich richtig verstanden habe versteht sich.

          Und ok habe ich garnich weitergedacht. Kryptografie sollte man doch in chips verwenden Tja die Praxis erlaubt nunmal nicht immer dass man überall direkt einen Chip einbaut wo man sowas braucht :-)

          Ich weis und es ist ja auch Sinnvoll.

          Ich hoffe ich hab richtig aufgepasst. Vor allem solltest du nicht alles sofort glauben was "man" dir sagt ;-)

          Sehr richtig, deswegen mache ich mich wo anders schlau.

          vlg MB

          1. Hallo,

            und es viel Zeit frist diese Bitweisen Operatoren "anzusprechen?" hat man mir gesagt und es auch Sinn ergibt. Was für einen Sinn ergibt das? Die sind genauso schnell "angesprochen" wie andere Operationen.

            Ich glaube du weist sehr wohl das einfache Negierungen eines Bits oder XOR-Verknüpfungen ein bissl schneller sind als zb sinus, exponenzial funktionen oder modulo berechnungen.

            ja natürlich, verschiedene Operationen sind verschieden kompliziert, und mit die aufwendigsten sind tatsächlich transzendente Funktionen, die von der FPU über eine Reihenentwicklung berechnet werden.

            Aber du hast ursprünglich gesagt, Bit-Operationen seien aufwendig bzw. zeitintensiv, und genau das Gegenteil ist der Fall: Das sind so ziemlich die schnellsten und effizientesten Operationen überhaupt.

            Außerdem kann man das gut in Hardware implementieren, genauso wie XOR-Verknüpfungen usw.

            Genau, eine Bit-Operation kann in der Regel auf einen einzigen CPU-Arbeitszyklus abgebildet werden.

            Ich hoffe ich hab richtig aufgepasst. Vor allem solltest du nicht alles sofort glauben was "man" dir sagt ;-)

            Sehr richtig, deswegen mache ich mich wo anders schlau.

            Gut. Immer eine zweite Meinung einholen, und ruhig auch mal hinterfragen oder anzweifeln, was andere sagen.

            So long,
             Martin

            --
            Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
            - Douglas Adams, The Hitchhiker's Guide To The Galaxy
            1. Bit-Operatoren sind sinnvoll, wenn die fachliche Aufgabenstellung eine Bitmanipulation ist. Wenn man sie braucht, und nicht hat, quält man sich mit Division und Modulo ab, um die benötigten Bits zu isolieren. Deshalb schadet es zur Laufzeit nichts, wenn die Sprache sie einfach mal anbietet. Der Parser braucht dann vielleicht einen Wimpernschlag länger. Sonst nichts.

              Aber du hast ursprünglich gesagt, Bit-Operationen seien aufwendig bzw. zeitintensiv, und genau das Gegenteil ist der Fall: Das sind so ziemlich die schnellsten und effizientesten Operationen überhaupt.

              Prinzipiell gebe ich Dir recht, aber z.B. MDN schreibt:

              The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.
              

              Und da frage ich: Wie speichert JavaScript Zahlen? Ist es nicht so, dass JavaScript nur "Number" kennt und als Fließkommazahl speichert? D.h. bei Anwendung der Bitoperatoren erfolgt implizit eine int/float. Und vorher noch eine Abfrage, ob vielleicht doch ein String in der Variablen steht. Wenn ja, muss der erstmal numerifiziert werden. Und vielleicht bit-kombiniert man Eigenschaftswerte aus Objekten? Das Ausführen der eigentlichen Bit-Operation gelingt dann vielleicht in einer New Yorker Sekunde (wie bitte?), aber während der Zeit für die Vorarbeit kannst Du den Rasen im Central Park mähen.

              Natürlich ist es nicht wirklich so schlimm. Man darf aber die Performance von Bit-Operationen in einer ungetypten Umgebung wie JavaScript nicht zu hoch einschätzen. Bei getypten Sprachen (oder Umgebungen wo der Compiler eine Typinferenz durchführen kann) entfällt die Vorarbeit, und nur dann ist es richtig fix.

              Ein Beispiel: Vor 15 Jahren hatte ich die Aufgabe, in C# eine Bitmap umzurechnen. Ich habe sie als Array von Punkten betrachtet und darauf hantiert. Die Operation pro Pixel war eine primitive Bitmanipulation, aber die ganze Bitmap durchzuackern dauerte viele Sekunden. Dann habe ich sogenannten unsafe Code benutzt (ein spezieller Modus von .net) und statt Tabellenzugriffen mit Pointern gearbeitet - und die Funktion war in einem Wimpernschlag fertig. Die Bitoperationen waren schnell, der Zeitfresser war der Arrayzugriff, bei dem jedesmal die Koordinaten auf Grenzverletzung geprüft wurden und in Speicheroffsets umzurechnen waren.

              Gruß Rolf

              1. Hallo,

                Prinzipiell gebe ich Dir recht, aber z.B. MDN schreibt:

                The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.
                

                logisch, dass Bit-Operationen auf String- oder float-Werten nicht sinnvoll sind.

                Und da frage ich: Wie speichert JavaScript Zahlen? Ist es nicht so, dass JavaScript nur "Number" kennt und als Fließkommazahl speichert?

                Das kommt wieder auf die konkrete JS-Engine an. Soweit ich weiß, konvertiert JS aber auch bei Number lustig zwischen int und float. Um die typischen Fallstricke bei der float-Arithmetik weitgehend zu vermeiden (z.B. die Rundungsfehler bei mehrfacher Addition), hält JS die Werte AFAIK bevorzugt als Integer vor, und wandelt sie intern erst dann in float, wenn der Wert das erforderlich macht. Ich meine, das hätte ich so in der Art mal in der ECMAScript-Spec gelesen.

                D.h. bei Anwendung der Bitoperatoren erfolgt implizit eine int/float. Und vorher noch eine Abfrage, ob vielleicht doch ein String in der Variablen steht. Wenn ja, muss der erstmal numerifiziert werden. Und vielleicht bit-kombiniert man Eigenschaftswerte aus Objekten? Das Ausführen der eigentlichen Bit-Operation gelingt dann vielleicht in einer New Yorker Sekunde (wie bitte?), aber während der Zeit für die Vorarbeit kannst Du den Rasen im Central Park mähen.

                Dieses ganze Gedöns, also das Holen der Operanden, das Überprüfen der Datentypen und bei Bedarf die Konvertierung, gilt aber für alle anderen Operationen entsprechend auch, deswegen habe ich den Aspekt gar nicht betrachtet. Und ja, ich mag es eigentlich nicht, wenn der Typ einer Variablen sich ohne mein Zutun ändern kann. Ich bevorzuge eigentlich eine feste Typisierung wie etwa in C.

                Ein Beispiel: Vor 15 Jahren hatte ich die Aufgabe, in C# eine Bitmap umzurechnen. Ich habe sie als Array von Punkten betrachtet und darauf hantiert. Die Operation pro Pixel war eine primitive Bitmanipulation, aber die ganze Bitmap durchzuackern dauerte viele Sekunden. Dann habe ich sogenannten unsafe Code benutzt (ein spezieller Modus von .net) und statt Tabellenzugriffen mit Pointern gearbeitet - und die Funktion war in einem Wimpernschlag fertig. Die Bitoperationen waren schnell, der Zeitfresser war der Arrayzugriff, bei dem jedesmal die Koordinaten auf Grenzverletzung geprüft wurden und in Speicheroffsets umzurechnen waren.

                Das überrascht mich überhaupt nicht.

                Ciao,
                 Martin

                --
                Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                - Douglas Adams, The Hitchhiker's Guide To The Galaxy
            2. Moin Martin,

              Aber du hast ursprünglich gesagt, Bit-Operationen seien aufwendig bzw. zeitintensiv, und genau das Gegenteil ist der Fall: Das sind so ziemlich die schnellsten und effizientesten Operationen überhaupt.

              Du hast da was missverstanden. Ich vermute mein Fehler ^^. Die Bit-operatoren sind die schnellsten, behaupte ich mal, in jeder Sprache. Aber ich vermute mal, das wenn sie vom Skript interpretiert werden sind sie langsamer. Ich nehme an, das ein Bytecode geschriebenes Programm - ich hoffe ich drück mich richtig aus - in sachen Bit Operatoren wesentlich schneller ist, weil es ja nicht vom Parser und der Engine eingelesen weden muss (die Begriffe waren mir neu). Darum meine Frage die man ausführlich beantwortet hat. Danke dafür :).

              Vlg MB

              1. ein Bytecode geschriebenes Programm

                hüstel

                Der Geschwindigkeitsunterschied zwischen einem in einem zu Bytecode übersetzen Programm, einem kompilierten Programm und einem Skript ist bei Bit-Operationen genau groß wie bei jeder anderen Operation. Jedenfalls gibt es keine Erklärung, weshalb Bit-Operationen speziell in Skriptsprachen langsamer sein sollen.

                1. nabend GWA,

                  Der Geschwindigkeitsunterschied zwischen einem in einem zu Bytecode übersetzen Programm, einem kompilierten Programm und einem Skript ist bei Bit-Operationen genau groß wie bei jeder anderen Operation. Jedenfalls gibt es keine Erklärung, weshalb Bit-Operationen speziell in Skriptsprachen langsamer sein sollen.

                  Ok, mir schein ich habe da etwas missverstanden oder ihr, was natürlich auf meinem Mist gewachsen ist ^^. Aber ich weis nicht was. Bitte entschuldige an alle. Mir wurde meine frage ausführlich beandwortet bedankt thumbup

                  vlg MB

  3. was für einen Sinn macht es in Skripsprachen, und nicht in maschinen nahe Hochsprachen, Bit-Operatoren zu verwenden?

    Ganz praktisches Beispiel:

    Berechnung von Netzwerkadresse, Broadcastadresse aus (in Zahl zurückverwandelte) IP und Netzwerkmaske; prüfen, ob eine IP zu Netzadresse und Netzwerkmaske passt ...

    1. @@Google weiß alles

      was für einen Sinn macht es in Skripsprachen, und nicht in maschinen nahe Hochsprachen, Bit-Operatoren zu verwenden?

      Ganz praktisches Beispiel:

      Noch ein Beispiel: UTF-8-Codierung/-Decodierung. Falls man sowas wie diesen Encoding Converter oder diesen Code Converter bauen möchte.

      LLAP 🖖

      --
      “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
      Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|