Der Buchhalter: Bitweiser NOT-Operator enttäuscht meine Erwartung

0 60

Bitweiser NOT-Operator enttäuscht meine Erwartung

Der Buchhalter
  • javascript
  1. 2
    Gunnar Bittersmann
    1. 0
      Der Buchhalter
      1. 0
        Gunnar Bittersmann
        1. 0
          Der Buchhalter
          1. 0
            Gunnar Bittersmann
            1. 0
              Der Buchhalter
          2. 0
            Rolf B
            1. 0
              Gunnar Bittersmann
              1. 0
                Rolf B
            2. 0
              Der Buchhalter
              1. 0
                Rolf B
              2. 0
                Christian Kruse
                1. 0

                  Zombies

                  Der Martin
                  • zu diesem forum
                  1. -1
                    Gunnar Bittersmann
        2. 0
          Der Buchhalter
          1. 0
            Robert B.
            1. 0
              Gunnar Bittersmann
              1. 0
                Robert B.
                1. 0
                  Der Martin
                  1. 0
                    Robert B.
                    1. 0
                      Der Martin
                      1. 0
                        Robert B.
                        • mathematik
                        1. 0
                          Rolf B
                          1. 0
                            Robert B.
                          2. 1
                            MudGuard
                            • sprache
                            1. 0
                              Gunnar Bittersmann
                              1. 0
                                Tabellenkalk
                              2. 0
                                Gunnar Bittersmann
                                1. 0
                                  Der Martin
                                  1. 0
                                    Auge
                                    • menschelei
                                    • sprache
                                    1. 0
                                      Der Martin
                                    2. 0
                                      Gunnar Bittersmann
                                      1. 0
                                        Gunnar Bittersmann
            2. 0
              Der Buchhalter
            3. 0
              Gunnar Bittersmann
  2. 0
    Rolf B
    1. 0
      Gunnar Bittersmann
      1. 0
        Rolf B
        1. 0
          Der Martin
          1. 0
            Rolf B
        2. 0
          Gunnar Bittersmann
  3. -3
    TS
    • javascript
    • versionsverwaltung
    1. 0
      Rolf B
      1. 0
        JürgenB
        1. 0
          Rolf B
          1. 0
            JürgenB
    2. 0
      Mitleser 2.0
      1. 0
        TS
        • javascript
        • mitarbeit
        • versionsverwaltung
        1. 0
          Mitleser 2.0
          1. 0
            TS
            • mitarbeit
          2. 0
            Rolf B
            1. -2
              TS
              1. 0
                Rolf B
  4. 0
    Samuel fiedler
    1. 0
      Gunnar Bittersmann
  5. 0
    Ich:
  6. 0
    Alexander Hein
    • php
    1. 1
      Rolf B
      1. 1
        TS
        • datentypen
        • php

Moin,

ich experimentiere grad mit Bit-Operatoren in Javascript. Den Hinweis im Wiki, dass Bit-Operatoren nur etwas für Experten sind, habe ich mal überlesen - irgendwie muss man ja anfangen. Einige Dinge haben schon geklappt, aber nun habe mir eine scheinbar einfache Aufgabe gestellt und finde das richtige Werkzeug nicht.

Ich möchte, dass aus "1101" der Wert "0010" wird. Soweit ich mich eingelesen habe, suche ich das Einerkomplement. Und als Werkzeug hatte/habe ich den NOT-Operator in Verdacht.

Die Umkehr des Vorzeichens und die daraus resultierende Darstellung als Zweierkomplement scheinen meinem Plan im Wege zu stehen. Aber noch habe ich die Hoffnung, dass mir nur mein eigenes Nicht-Verständnis der Materie mir im Weg steht.

Wo bin ich gedanklich falsch abgebogen? Was muss ich verstehen, um meine Aufgabe lösen zu können? Warum finde ich immer wieder den Hinweis, einfach den NOT-Operator zu verwenden um das Einerkomplement zu erhalten? Ist es eine Eigenheit von Javascript, dass das Ergebnis als Zweierkomplement zurückgegeben wird?

Fragende Grüße vom Buchhalter

PS: Um mein Wunsch-Ergebnis zu erreichen ist mir bislang nur folgender Ansatz eingefallen:

x = 13 // 1101
y = 2 ** x.toString(2).length - 1 ^ x // 0010
// oder
y = 2 ** x.toString(2).length - 1 - x // 0010

Dieser Ansatz ist mir auch im Netz als Lösungsvorschlag untergekommen. Mir missfällt aber der Einsatz einer String-Methode. Und ich hätte es gern kompakter.

  1. @@Der Buchhalter

    Ich möchte, dass aus "1101" der Wert "0010" wird. Soweit ich mich eingelesen habe, suche ich das Einerkomplement. Und als Werkzeug hatte/habe ich den NOT-Operator in Verdacht.

    Bitwise NOT (~)

    Der macht aus 0…01101 dann 1…10010. Die Einsen am Anfang willst du nicht; deshalb musst du deine Anzahl von Bits maskieren:

    const x = 0b1101;
    const y = ~x & 0b1111; // ergibt 2 = 0b0010
    

    😷 LLAP

    --
    „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
    — Joachim Gauck über Impfgegner
    1. Vielen Dank. Das könnte der Anstoß in die richtige Richtung sein. Ich muss das mal in Ruhe zerdenken.

      Die grundsätzliche Idee, die Einsen zu maskieren hatte ich auch schon. Ich habe aber keine elegante Möglichkeit gefunden, die Maske zu bilden. Dort würde ich wieder die String-Methode brauchen. Oder?

      1. @@Der Buchhalter

        Die grundsätzliche Idee, die Einsen zu maskieren hatte ich auch schon. Ich habe aber keine elegante Möglichkeit gefunden, die Maske zu bilden. Dort würde ich wieder die String-Methode brauchen. Oder?

        ?? Ich hatte dir doch gerade gezeigt wie’s geht.

        😷 LLAP

        --
        „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
        — Joachim Gauck über Impfgegner
        1. Du hast 0x1111 als Maske fest codiert. Ich kenne aber nicht die länge meines Ausgangswerts. Bzw. wünsche ich mir ein Verfahren für variable längen. Dies hatte ich vergessen zu erwähnen.

          1. @@Der Buchhalter

            Du hast 0x1111 als Maske fest codiert. Ich kenne aber nicht die länge meines Ausgangswerts. Bzw. wünsche ich mir ein Verfahren für variable längen. Dies hatte ich vergessen zu erwähnen.

            Ja, das hat du. Wie kann man von einem Bitmuster dessen Länge nicht kennen?

            Was ist dein Anwendungsfall? Oder hast du gar keinen, sondern du „experimentier[st] grad mit Bit-Operatoren in Javascript“ um des Experimentierens Willen?

            😷 LLAP

            --
            „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
            — Joachim Gauck über Impfgegner
            1. Es sind ganz spielerische Experimente mit selbst erdachten Bedingungen und Wünschen.

          2. Hallo Buchhalter,

            die konkrete Wortlänge musst Du aber schon kennen. Denn wie willst Du im Programm sonst wissen, ob 0b1101 oder 0b001101 zu invertieren ist. Aus Sicht von JavaScript ist das beides die Zahl 13, das Literal ist zur Laufzeit in seiner Textform nicht bekannt.

            Wenn Du deine Wortlänge auf bspw. 6 festlegst, bekommst Du die Maske dadurch, dass Du die 1 um 6 Bits nach links verschiebst, also von 0b1 nach 0b1000000 gehst, und dann 1 abziehst, das ergibt 0b111111. Zum Linksverschieben verwendet man den << Operator.

            Wenn Du die Maske hast, brauchst Du keinen NOT-Operator mehr, sondern machst direkt einen XOR, der ^ Operator. In a ^ maske werden alle die Bits von a geflippt, wo die Maske ein 1-Bit hat.

            function flipBits(value, length) {
              return value ^ ((1 << length) - 1);
            }
            

            Das Minus hat höhrere Prio als ^, deswegen muss ( 1<<length)-1 nicht geklammert werden. Ich hab's trotzdem gemacht, um Unklarheiten zu vermeiden. Es hat aber auch höhere Prio als <<, deswegen müssen dort die Klammern hin.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. @@Rolf B

              Wenn Du die Maske hast, brauchst Du keinen NOT-Operator mehr, sondern machst direkt einen XOR, der ^ Operator.

              Ah, ~x & 0b1111 ließe sich auch als x ^ 0b1111 schreiben.

              Ich würde das aber nicht tun. Ersteres ist sprechender Code, zweiteres ist „Häh?“.

              Ergänzung: Zumal ^ in anderen Sprachen der Potenzoperator ist.

              😷 LLAP

              --
              „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
              — Joachim Gauck über Impfgegner
              1. Hallo Gunnar,

                musst Du ja auch nicht tun. ~a & ((1<<length)-1) tut's ja auch, ist nur eine Operation mehr. Für Golfer wie Dich sollte das doch ein K.O. sein 😉

                Für den, der ~ und ^ nicht kennt, ist beides Häh?.

                Das ein XOR Bits kippt, ein AND sie löscht und ein OR sie setzt, weiß man altgedienter Assemblerprogrammierer (6502, 6809, 8086+, 68000, IBM/370) doch.

                Rolf

                --
                sumpsi - posui - obstruxi
            2. Hallo Rolf,

              die konkrete Wortlänge musst Du aber schon kennen. Denn wie willst Du im Programm sonst wissen, ob 0b1101 oder 0b001101 zu invertieren ist. Aus Sicht von JavaScript ist das beides die Zahl 13, das Literal ist zur Laufzeit in seiner Textform nicht bekannt.

              Dieser Umstand war mir heute morgen noch nicht bekannt, bzw. die Konsequenzen nicht bewusst. Jetzt erscheint es mir ganz logisch. Genau um solche Erkenntnis-Gewinne ging es mir bei meinen Experimenten. Ich habe zum Glück kein konkretes Ziel oder eine Deadline, sondern kann mich einfach austoben.

              Vielen Dank auch Dir.

              PS: Kann ich als nicht-angemeldeter User keine Antwort akzeptieren, oder übersehe ich den Button?

              1. Hallo Buchhalter,

                "akzeptieren" ist ein gelber Button mit einem Haken, rechts unten am Beitragstext. Kann sein, dass das nur angemeldet geht.

                Rolf

                --
                sumpsi - posui - obstruxi
              2. Hallo,

                PS: Kann ich als nicht-angemeldeter User keine Antwort akzeptieren, oder übersehe ich den Button?

                Das hättest du tun können, wenn du den Haken „speichere die Identität in einem Cookie“ beim erstellen des Threads angehakt hättest.

                Ohne den Haken kann das Forum dich nicht identifizieren, und damit darfst du dann keine Antworten akzeptieren.

                Freundliche Grüße,
                Christian Kruse

                1. Hallo Christian, hallo Gunnar,

                  PS: Kann ich als nicht-angemeldeter User keine Antwort akzeptieren, oder übersehe ich den Button?

                  Das hättest du tun können, wenn du den Haken „speichere die Identität in einem Cookie“ beim erstellen des Threads angehakt hättest.

                  Ohne den Haken kann das Forum dich nicht identifizieren, und damit darfst du dann keine Antworten akzeptieren.

                  ohne den Inhalt eurer Postings abwerten zu wollen - aber ist es denn wirklich sinnvoll, einen Thread, der seit einem Monat inaktiv ist, nochmal wiederzubeleben? Das ist doch Störung der Totenruhe.

                  Immer eine Handbreit Wasser unterm Kiel
                   Martin

                  --
                  The taste of love: The more you get, the more you want
                  (aus The Lightning Seeds: Sense)
                  1. @@Der Martin

                    ohne den Inhalt eurer Postings abwerten zu wollen - aber ist es denn wirklich sinnvoll, einen Thread, der seit einem Monat inaktiv ist, nochmal wiederzubeleben?

                    Wie gesagt: das Foto fiel mir heute zufällig in die Hände, und da’s zum Thread passt und der noch nicht im Archiv gelandet war …

                    Und solange man hier ungestraft „funktioniert nicht im $totenBrowser“ sagen darf …

                    Das ist doch Störung der Totenruhe.

                    … denn das ist Störung der Totenruhe! 😜

                    😷 LLAP

                    --
                    „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
                    — Joachim Gauck über Impfgegner
        2. Danke, das war schon der entscheidende Denk-Anstoß. Ich muss ja gar nicht die Länge der Maske kennen. Denn ich weiß, dass mein Ausgangswert maximal 16 Bits lang ist. Insofern kann ich immer 2**16-1 als Maske verwenden.

          Vielen Dank

          1. Moin,

            Ich muss ja gar nicht die Länge der Maske kennen. Denn ich weiß, dass mein Ausgangswert maximal 16 Bits lang ist. Insofern kann ich immer 2**16-1 als Maske verwenden.

            sofern ich da keinen Denkfehler habe, funktioniert das mit dieser Maske nicht:

            const x = 13;  // = 0b1101
            ~x & 65535;    // = 65522
            

            Die nötige Maskenlänge bekommst du mit dem 2er-Logarithmus:

            const MaskLen = Math.ceil(Math.log(x) / Math.log(2) /* ≈ 3.7 */);    // = 4
            const Mask = 2 ** MaskLen - 1;    // = 15 bzw. 0b1111
            
            ~x & Mask;    // = 2 = 0b0010
            

            Viele Grüße
            Robert

            1. @@Robert B.

              Ich muss ja gar nicht die Länge der Maske kennen. Denn ich weiß, dass mein Ausgangswert maximal 16 Bits lang ist. Insofern kann ich immer 2**16-1 als Maske verwenden.

              sofern ich da keinen Denkfehler habe

              Ich glaub, du hast da einen.

              Die nötige Maskenlänge bekommst du mit dem 2er-Logarithmus:

              const MaskLen = Math.ceil(Math.log(x) / Math.log(2) /* ≈ 3.7 */);    // = 4
              

              Nö. Die höherwertigen Datenbits in x können ja 0 gesetzt sein. Um zu entscheiden, wie viele von den führenden Nullen Datenbits sind, muss man die Anzahl der Datenbits kennen. Die Maskenlänge darf nicht vom aktuellen Wert von x abhängen.

              😷 LLAP

              --
              „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
              — Joachim Gauck über Impfgegner
              1. Moin Gunnar,

                Die höherwertigen Datenbits in x können ja 0 gesetzt sein. Um zu entscheiden, wie viele von den führenden Nullen Datenbits sind, muss man die Anzahl der Datenbits kennen. Die Maskenlänge darf nicht vom aktuellen Wert von x abhängen.

                ich glaube, dass JavaScript an dieser Stelle vielleicht die falsche Sprache ist:

                const x = 0b00001101;    // =  13
                ~x & 0b11111111;         // = 242
                
                ~0b00001101 & 0b11111111 // = 242
                

                Viele Grüße
                Robert

                1. Hallo Robert,

                  Die Maskenlänge darf nicht vom aktuellen Wert von x abhängen.

                  ich glaube, dass JavaScript an dieser Stelle vielleicht die falsche Sprache ist:

                  const x = 0b00001101;    // =  13
                  ~x & 0b11111111;         // = 242
                  
                  ~0b00001101 & 0b11111111 // = 242
                  

                  ja und? Passt doch! Sowohl im Kopf als auch auf'm Zettel bekomme ich dasselbe Ergebnis.
                  Oder was erwartest du?

                  May the Schwartz be with you
                   Martin

                  --
                  Wenn ich den See seh, brauch ich kein Meer mehr.
                  1. Moin Martin,

                    Oder was erwartest du?

                    2.

                    Viele Grüße
                    Robert

                    1. Hallo,

                      Oder was erwartest du?

                      2.

                      dann bist du aber auf dem Holzweg. Bitweise Negation heißt: Alle Bits umdrehen. Und alle heißt, alle 32 oder alle 64, je nach Plattform. Du bekommst also erstmal ein Zwischenergebnis mit vielen, vielen Einsen, wo im Ausgangswert nicht ausgeschriebene führende Nullen waren. Deine Maske ist 8 Bit breit, lässt also vom Zwischenergebnis nur die 8 niederwertigsten Bits stehen. Also 0b11110010 oder 242 oder 0xF2.

                      Wenn du 0b0010 oder 2 als Ergebnis erwartest, musst du mit einer 4 Bit breiten Maske schneiden.

                      May the Schwartz be with you
                       Martin

                      --
                      Wenn ich den See seh, brauch ich kein Meer mehr.
                      1. Moin Matthias,

                        Oder was erwartest du?

                        2.

                        dann bist du aber auf dem Holzweg.

                        Das war die Ausgangsfrage.

                        Bitweise Negation heißt: Alle Bits umdrehen. Und alle heißt, alle 32 oder alle 64, je nach Plattform.

                        Oder es heißt Boolesche Algebra, wie ich den Ausgangspost verstanden habe. Mathematik ist nicht auf Plattformen limitiert.

                        Viele Grüße
                        Robert

                        1. Hallo Robert,

                          Oder es heißt Boolesche Algebra, wie ich den Ausgangspost verstanden habe.

                          Kann eigentlich nicht sein. Im Subject und auch im Text des OP steht oft genug "bitweise".

                          Rolf

                          --
                          sumpsi - posui - obstruxi
                          1. Moin Rolf,

                            Oder es heißt Boolesche Algebra, wie ich den Ausgangspost verstanden habe.

                            Kann eigentlich nicht sein. Im Subject und auch im Text des OP steht oft genug "bitweise".

                            bit ist die Kurzform für binary digit. Im Ausgangsbeitrag ging es um Boolesche Operationen mit Zahlen in binärer Darstellung, d.h. entlang deren Stellen. Der Begriff „bitweise“ kann auf die Darstellung in Prozessorarchitekturen hindeuten, kann aber auch die Algebra auf jenen Zahlen meinen. Die Frage kann wohl nur Der Buchhalter zufriedenstellend beantworten.

                            Viele Grüße
                            Robert

                          2. Hi,

                            Kann eigentlich nicht sein. Im Subject und auch im Text des OP steht oft genug "bitweise".

                            Und ich hab die ganze Zeit "budweiser" gelesen. Bitte ein Bit! 😉 🍻

                            cu,
                            Andreas a/k/a MudGuard

                            1. @@MudGuard

                              Und ich hab die ganze Zeit "budweiser" gelesen. Bitte ein Bit! 😉 🍻

                              Das erste ist trinkbares Bier. Was ist das andere?

                              😷 LLAP

                              --
                              „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
                              — Joachim Gauck über Impfgegner
                              1. Hallo,

                                Bit! 😉 🍻

                                Was ist das?

                                Laut Wikipedia eine Birke!

                                Gruß
                                Kalk

                              2. @@Gunnar Bittersmann

                                Und ich hab die ganze Zeit "budweiser" gelesen. Bitte ein Bit! 😉 🍻

                                Das erste ist trinkbares Bier.

                                Womit natürlich das Budweiser aus Budweis (České Budějovice) gemeint ist. 🍻

                                😷 LLAP

                                --
                                „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
                                — Joachim Gauck über Impfgegner
                                1. Hallo,

                                  Und ich hab die ganze Zeit "budweiser" gelesen. Bitte ein Bit! 😉 🍻

                                  Das erste ist trinkbares Bier.

                                  Womit natürlich das Budweiser aus Budweis (České Budějovice) gemeint ist. 🍻

                                  natürlich - das gleichnamige amerikanische Zeug ist ja kein Bier. Das sollte man nicht trinken, sondern höchstens ins Pferd zurückschütten.

                                  Immer eine Handbreit Wasser unterm Kiel
                                   Martin

                                  --
                                  Wenn ich den See seh, brauch ich kein Meer mehr.
                                  1. Hallo

                                    Und ich hab die ganze Zeit "budweiser" gelesen. Bitte ein Bit! 😉 🍻

                                    Das erste ist trinkbares Bier.

                                    Womit natürlich das Budweiser aus Budweis (České Budějovice) gemeint ist. 🍻

                                    natürlich - das gleichnamige amerikanische Zeug …

                                    … ist seit einem Rechtstreit mit Budweiser (aus Budvar) nicht mehr gleichnamig [1]

                                    … ist ja kein Bier …

                                    … genausowenig wie Oettinger.

                                    Tschö, Auge

                                    --
                                    200 ist das neue 35.

                                    1. die heißen jetzt nur noch „Bud“ ↩︎

                                    1. Hi,

                                      natürlich - das gleichnamige amerikanische Zeug …

                                      … ist seit einem Rechtstreit mit Budweiser (aus Budvar) nicht mehr gleichnamig …
                                      die heißen jetzt nur noch „Bud“

                                      hmm, seit wann? Ich war zuletzt 2001 in den Staaten, und ich meine, auf den Bud-Flaschen hätte in recht kleiner Schrift noch was von Budweiser gestanden. Aber das ist lange her.

                                      … ist ja kein Bier …

                                      … genausowenig wie Oettinger.

                                      Mein Vater nennt das treffend Bratkartoffelbier. Also ein Bier, das man einfach so zu Bratkartoffeln oder ähnlich deftigen Speisen trinkt und nicht direkt wegen des Biergenusses. Dazu zählen dann auch die diversen Discounter-Biere in PET-Flaschen.

                                      Immer eine Handbreit Wasser unterm Kiel
                                       Martin

                                      --
                                      Wenn ich den See seh, brauch ich kein Meer mehr.
                                    2. @@Auge

                                      … ist seit einem Rechtstreit mit Budweiser (aus Budvar) nicht mehr gleichnamig

                                      Abhängig von der Region, siehe Wikipedia: Budweiser-Streit.

                                      „Aus Budvar“? Budvar ist der tschechische Name des Bieres, nicht des Herkunftortes.

                                      😷 LLAP

                                      --
                                      „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
                                      — Joachim Gauck über Impfgegner
                                      1. @@Gunnar Bittersmann

                                        „Aus Budvar“? Budvar ist der tschechische Name des Bieres, nicht des Herkunftortes.

                                        Und auch der Name der Brauerei.

                                        Symbolbild (heute zufällig auf meinem iPhone wiederentdeckt):

                                        Bierdeckel mit Aufschrift „Budějovický Budvar“ auf Tisch mit Aufschrift „Budweiser Budvar“

                                        Na zdraví! 🍻

                                        😷 LLAP

                                        --
                                        „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
                                        — Joachim Gauck über Impfgegner
            2. Moin Robert,

              ja, ich habe mittlerweile auch festgestellt, dass ich so nicht ans Ziel komme. Ich dachte, ich hätte meinen Ansatz direkt in der Konsole getestet, aber offenbar war dem nicht so. Selbst unter meinen Fantasie-Bedingungen ist dies keine gangbare Lösung.

              Dein Weg die Maskenlänge zu bestimmen, gefällt mir schon mal besser als mein Ansatz mit der String-Funktion. Nur in Sachen Kompaktheit hatte ich mir mehr versprochen - z. B. einen einzelnen Operator der die ganze Arbeit erledigt. Einen solchen Glücksfund scheint es in diesem Fall nicht zu geben.

              Dein Ansatz ist mir allein schon deswegen sympathisch, weil ich jetzt motiviert bin, meine alten Mathe-Kenntnisse hervorzukramen, um zu verstehen, warum das überhaupt funktioniert 😃

              Beste Grüße

            3. @@Robert B.

              const MaskLen = Math.ceil(Math.log(x) / Math.log(2) /* ≈ 3.7 */);    // = 4
              

              Abgesehen davon, dass das nicht zielführend ist, ist Math.log(x) / Math.log(2) auch unnötig: es gibt Math.log2().

              😷 LLAP

              --
              „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
              — Joachim Gauck über Impfgegner
  2. Hallo Buchhalter,

    nach etwas nachdenken kommt mir der Gedanke, dass man Bits auch viel einfacher flippen kann. Der Weg dahin ist allerdings mit etwas Algebra gepflastert…

    Beispiel: In einer 5-Bit Welt wird die 13 zur Binärzahl 01101 und kann als eine Summe ihrer Bitwerte dargestellt werden:

    $$13 = 0b01101 = 0\cdot 16 + 1\cdot 8 + 1\cdot 4 + 0\cdot 2 + 1\cdot 1$$

    Wenn ich die Bits rein mathematisch invertieren will, muss ich die Koeffizienten vor den Stellenwerten umdrehen, aus 0 1 machen und aus 1 0, dafür muss ich den Koeffizienten jeweils von 1 abziehen. Die Invertierung ergibt also

    $$(1-0)\cdot 16 + (1-1)\cdot 8 + (1-1)\cdot 4 + (1-0)\cdot 2 + (1-1)\cdot 1$$
    ausmultiplizieren
    $$= 1\cdot 16 - 1\cdot 16 + 1\cdot 8 - 1\cdot 8 + 1\cdot 4 - 1\cdot 4 + 1\cdot 2 -0\cdot 2 + 1\cdot 1 -1 \cdot 1$$
    umsortieren
    $$= 1\cdot 16 + 1\cdot 8 + 1\cdot 4 + 1\cdot 2 + 1\cdot 1 - 0\cdot 16 - 1\cdot 8 - 1\cdot 4 - 0\cdot 2 - 1 \cdot 1$$
    gruppieren
    $$= (1\cdot 16 + 1\cdot 8 + 1\cdot 4 + 1\cdot 2 + 1\cdot 1) - (0\cdot 16 + 1\cdot 8 + 1\cdot 4 + 0\cdot 2 + 1 \cdot 1)$$

    Ich habe das absichtlich so mühsam aufgedröselt. Denn jetzt sieht man, dass die linke Klammer der Binärzahl 11111 entspricht und die rechte Klammer dem Eingabewert in die Rechnung: 01101. Ich hätte das auch mit $$a_0$$ bis $$a_i$$ und einer Orgie von $$\sum$$ Zeichen schreiben können. Aber bevor Du schreiend wegrennst...

    Bei einer Wortlänge L entspricht ein Wort aus lauter 1-Bits dem Wert $$2^L-1$$. Warum? Das ist eine der Übungsaufgaben zur Vollständigen Induktion aus der Schule: $$\sum_{i=0}^n 2^i= 2^{n+1}$$.

    Was haben wir gesehen? Die Bits einer Binärzahl der Wortlänge L zu flippen, bedeutet, sie von $$2^L-1$$ abzuziehen.

    In Code:

    function flip16bit(a) {
       return 65535-a;
    }
    

    Natürlich nur unter der Annahme, dass irgendwo sichergestellt ist, dass a im richtigen Wertebereich ist. Sonst gibt's GIGO (garbage in, garbage out).

    Rolf

    --
    sumpsi - posui - obstruxi
    1. @@Rolf B

      Was haben wir gesehen? Die Bits einer Binärzahl der Wortlänge L zu flippen, bedeutet, sie von $$2^L-1$$ abzuziehen.

      Sollte das jetzt eine Lektion in Wie macht man aus sprechendem Code unverständlichen Code? sein?

      😷 LLAP

      --
      „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
      — Joachim Gauck über Impfgegner
      1. Hallo Gunnar,

        eher in: Wie funktioniert das Binärformat meines Computers.

        Die Entscheidung, welchen Code er nehmen möchte, kann der Buchhalter treffen.

        ICH würde die 65535 - X Variante nehmen und einen kurzen Kommentar drüberschreiben. Ist Mikrooptimierung, aber wer mit Bits hantiert, hat es meistens arg eilig.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          eher in: Wie funktioniert das Binärformat meines Computers.

          Die Entscheidung, welchen Code er nehmen möchte, kann der Buchhalter treffen.

          kann er, muss er. Aber wenn er schon so weit ist, die Operanden auch in Binärschreibweise zu notieren, dann dürfte es für ihn anschaulicher und leichter nachvollziehbar sein, eine logische Operation direkt auf Bit-Ebene zu beschreiben.

          ICH würde die 65535 - X Variante nehmen und einen kurzen Kommentar drüberschreiben. Ist Mikrooptimierung, aber wer mit Bits hantiert, hat es meistens arg eilig.

          Das wäre dann ein weiterer Grund für die logische Operation. Eine Negation ist bei vielen CPUs in nur einem einzigen Taktzyklus erledigt. Die Subtraktion braucht mindestens einen Zyklus länger, weil noch ein Operand geholt werden muss (entweder aus dem Datensegment oder direkt als Teil der CPU-Instruktion).

          May the Schwartz be with you
           Martin

          --
          Wenn ich den See seh, brauch ich kein Meer mehr.
          1. Hallo Martin,

            Eine Negation ist bei vielen CPUs in nur einem einzigen Taktzyklus erledigt. Die Subtraktion braucht mindestens einen Zyklus länger, weil noch ein Operand geholt werden muss

            Den Operand hat Gunnar auch, für das AND. Dass seine Version die lesbarste ist, will ich gar nicht bestreiten.

            Was beim Assemblieren wirklich stört, ist das Temp-Register, das meine Version braucht, weil ich den Wert von einer Konstanten abziehe.

            Aber, was dann wieder unterging, war die XOR Version: value ^ 65535. Die lässt sich in einer Instruktion realisieren, je nach verwendetem Transistorenhaufen sogar ohne Register.

            Es gibt eine Menge Wege, unter Ausnutzung der Werterepräsentation Bitoperationen ohne Bitoperatoren durchzuführen.

            Zyklen zu zählen ist auf modernen Prozessoren aber zumeist sinnlos. Die Pipelines und Caches haben massiven Einfluss auf den Ablauf. Deswegen produzieren die Intel-Compiler auch massiv schnelleren Code als beispielsweise die Microsoft-Compiler.

            Wie gut die Optimizer von V8 oder Spidermonkey sind, weiß man auch nicht. Oder? Jedenfalls ist C# bei mir eher schneller als JavaScript, und C++ noch sehr viel mehr.

            Rolf

            --
            sumpsi - posui - obstruxi
        2. @@Rolf B

          eher in: Wie funktioniert das Binärformat meines Computers.

          Bei der Programmierung in einer Hochsprache ziemlich irrelevant.

          Zahlen sind Zahlen und Bitmuster sind Bitmuster. Die Datentypen sollte man nicht vermischen – auch wenn es Bitmuster gar nicht als expliziten Datentypen gibt, sondern diese intern als Zahlen repräsentiert werden.

          Nicht umsonst habe ich hier in meinen Beispielen für Bitmuster die Binärschreibweise 0b… verwendet.

          ICH würde die 65535 - X Variante nehmen und einen kurzen Kommentar drüberschreiben.

          Unleserlichen Code schreiben und dann mittels eines Kommentars erklären, was der Code tut? Ernsthaft?

          Nein. Man schreibt lesbaren Code, der keines Kommentars bedarf, was er tut.

          Wenn man Code kommentiert, dann sollte es um das Warum gehen, nicht um das Was.

          Ist Mikrooptimierung, aber wer mit Bits hantiert, hat es meistens arg eilig.

          Das mag evtl. bei hardwarenaher Programmierung in C zutreffen. Wir sind hier bei JavaScript – also weit weg davon.

          😷 LLAP

          --
          „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
          — Joachim Gauck über Impfgegner
  3. Hello,

    kann mir mal jemand erklären, was an dieser Überlegung mir bisher schon drei Minuspunkte eingebracht hat?

    Ich habe auf (vermutlich inkonsistenten Systemen) schon kuriose Abweichungen des Verhaltens durch unterschiedliche Registerbreiten in den verschiedenen Schichten erlebt.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Hallo Tom,

      ???

      Der Browser, bzw. die verwendete JS Engine und ihre Version sind bei unerwartetem Verhalten der Operatoren vielleicht noch relevant. Es ging aber eher um Vorgehensweisen und nicht um technische Defekte.

      Es müssen schon alle zusammenpassen, also sowohl der Ersteller der Tools, als auch der Anwender-Host der Tools.

      Dieser Satz ist nicht falsch. Er ist aber eine Kanone. Und das Problem ist ein Goldfisch.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo Rolf,

        die Lösung des Problems ist ganz einfach: man muss nur vorgeben, wie leading zeros, also "unsichtbare" Ziffern, behandelt werden sollen.

        Gruß
        Jürgen

        1. Hallo JürgenB,

          sicher. Deswegen redeten Gunnar und ich ja auch ausführlich über das Thema Wortlänge.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf,

            sicher. Deswegen redeten Gunnar und ich ja auch ausführlich über das Thema Wortlänge.

            ich wollte es ja auch nur noch mal mit anderen Worten wiederholen.

            Gruß
            Jürgen

    2. welche Versionen von OS, Browser, usw. sind den installiert?

      Was sind den „usw.“?

      1. Hello,

        welche Versionen von OS, Browser, usw. sind den installiert?

        Was sind den „usw.“?

        Meintest Du:

        "Was sind denn „usw.“"?

        Z. B. installierte oder dazugeladene Module?

        Weiß ich denn, welche Add-Ons sich der jeweilige Anwender in seinen Browser geladen hat, oder welche Zusatzsoftware in welcher Schicht werkelt?

        Weißt Du das mit Sicherheit?

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Hello,

          welche Versionen von OS, Browser, usw. sind den installiert?

          Was sind den „usw.“?

          Meintest Du:

          "Was sind denn „usw.“"?

          Nein, ich meinte "Was sind den „usw.“?", weil ich Dich originalgetreu zitieren wollte.

          1. Hello,

            welche Versionen von OS, Browser, usw. sind den installiert?

            Was sind den „usw.“?

            Meintest Du:

            "Was sind denn „usw.“"?

            Nein, ich meinte "Was sind den „usw.“?", weil ich Dich originalgetreu zitieren wollte.

            Ach so. Du wolltest - wie üblich - nur ein bisschen Zanken?
            Oder was war der konstruktive Teil deines Postings?

            Glück Auf
            Tom vom Berg

            --
            Es gibt nichts Gutes, außer man tut es!
            Das Leben selbst ist der Sinn.
          2. Hallo,

            Dieser Beitrag wurde gemeldet: Beitrag ist unkonstruktiv

            Das finde ich gar nicht. Die Frage, was genau mit dem "usw" gemeint ist, finde ich durchaus relevant. Dass Tom sich weigert, das zu konkretisieren, ist viel eher unkonstruktiv.

            Generell wenig hilfreich finde ich dagegen, wie ich schon vor 4 Tagen schrieb, diesen Teilthread. Bei der Frage, wie sich ein Bit-Operator in JS verhält, ist maximal die JS Engine von Interesse. Plugins oder OS sollten damit nichts zu tun haben.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hello,

              Dieser Beitrag wurde gemeldet: Beitrag ist unkonstruktiv

              Das finde ich gar nicht. Die Frage, was genau mit dem "usw" gemeint ist, finde ich durchaus relevant. Dass Tom sich weigert, das zu konkretisieren, ist viel eher unkonstruktiv.

              Ach, bist DU etwa der ständige Mobber?

              Ich habe mich nicht geweigert, sondern es auf Rückfrage konkretisiert.

              Nur weil DU schreibst, wie ein Bit-Operator sich normalerweise verhalten sollte, heißt das noch lange nicht, dass er sich in der Praxis auch so verhält.

              Glück Auf
              Tom vom Berg

              --
              Es gibt nichts Gutes, außer man tut es!
              Das Leben selbst ist der Sinn.
              1. Hallo Tom,

                ich bin ein aktiver Leser und Schreiber, kein Mitleser. Leider loggt das Forum aus Datenschutzgründen nicht soviel, dass man den Kameraden identifizieren könnte. Datenschutz wäre ja toll, wenn sich unter seinem Mäntelchen nicht so viele Lümmel verstecken würden.

                Dass Du meine Meinung, dass Basisoperationen der JS Engine von Plugins oder OS unabhängig sein sollten, nicht teilst, haben wir nun herausgearbeitet. Dass dein "usw" ein Nebelfeld verbreitet, das der Mitleser etwas gehoben haben wollte, sollte Dir auch klar sein. Möglicherweise wollte er Dich auch nur noch etwas weiter auf den dünnen Ast hinauslocken, auf dem Du eh schon bist.

                Ist mir aber egal, da reite ich nicht drauf rum. Denn ich meine nach wie vor, dass die ganze Tangente hier für die Frage des TO irrelevant ist. Er hatte keine Probleme damit, dass sich diese Operationen unerwartet verhielten. Er hatte Probleme damit, sie richtig einzusetzen. Bzw. suchte Verbesserungspotenzial.

                Meine Deutung als Weigerung nehme ich aber wieder zurück, ich hab wohl nicht genau gelesen.

                Dass Du deinen Beitrag aber komplett umeditiert hast, so dass er mit dem Ursprungsbeitrag gar nichts mehr zu tun hat, außer über die Minusse zu maulen, das war nicht gut. Bitte hole den Ursprungsbeitrag aus der Historie und setz ihn davor. Sonst weiß man gar nicht, worum es geht. Eins der Minusse war von mir und im Folgebeitrag begründet. Die beiden anderen werden wohl ähnliche Motive haben. Oder es gab sie dafür, dass Du den Beitrag 100% umeditiert hast. Keine Ahnung. Ich kann nur eins geben.

                Rolf

                --
                sumpsi - posui - obstruxi
  4. Hallo Der Buchhalter!

    Ich hoffe, bisher hatte noch niemand diese Antwort, aber diese Diskussion finde ich persönlich etwas unordentlich. Daher konnte ich nicht so gut erkennen, ob jemand schon meine Idee hatte.

    function komplement(zahl){
      return 0b1111 − zahl;
    }
    

    Du kannst für das Einserkomplement einfach in dem Fall 1111 benutzen.
    Wenn du also aus 1101 0010 machen möchtest, dann kannst du 1111 − 1101 = 0010 machen.

    Au revoir,
    Samuel Fiedler

    1. @@Samuel fiedler

      Ich hoffe, bisher hatte noch niemand diese Antwort

      Leider doch. Rolf hatte die Idee auch schon. Und ich habe dargelegt, warum ich das für keine gute Idee halte.

      😷 LLAP

      --
      „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
      — Joachim Gauck über Impfgegner
  5. Dieser Beitrag wurde gelöscht: Nur bla bla
  6. Ich finde es hier nicht sehr ordentlich, da so viele beiträge da sind. daher weiß ich nicht ob schon wer diese idee hatte:


    IF zeichen1 == 1 Setze es auf 0;
    
    IF zeichen1 == 0 Setze es auf 1;
    
    IF zeichen2 == 1 Setze es auf 0;
    
    IF zeichen2 == 0 Setze es auf 1;
    

    Grüße Alexander

    --

    Wer anderen eine Grube gräbt, fällt selbst hinein.

    1. Hallo Alexander,

      natürlich kann man Bitoperationen mit Zeichen nachbilden, aber dann baut man auf umständliche Weise etwas nach, wozu JavaScript fertige Operatoren hat.

      Deswegen ist dein Gedanke nicht so empfehlenswert.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hello,

        natürlich kann man Bitoperationen mit Zeichen nachbilden, aber dann baut man auf umständliche Weise etwas nach, wozu JavaScript fertige Operatoren hat.

        Deswegen ist dein Gedanke nicht so empfehlenswert.

        Stimmt!

        Das ist nur relevant für die Darstellung in der Benutzerschnittstelle. Da kann man mit den reinen Zahlenwerten nichts anfangen.

        Der Prozessor selber kann mit dieser Darstellung aber nicht optimal arbeiten.

        Das wird leider oft verwechselt, welcher Datentyp in welcher Darstellung wo benötigt wird.

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.