Bitweiser NOT-Operator enttäuscht meine Erwartung
Der Buchhalter
- javascript
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.
@@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.
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
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?
@@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
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.
@@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
Es sind ganz spielerische Experimente mit selbst erdachten Bedingungen und Wünschen.
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
@@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
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
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?
Hallo Buchhalter,
"akzeptieren" ist ein gelber Button mit einem Haken, rechts unten am Beitragstext. Kann sein, dass das nur angemeldet geht.
Rolf
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
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
@@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
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
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
@@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
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
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
Hallo,
Oder was erwartest du?
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
Moin Matthias,
Oder was erwartest du?
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
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
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
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
@@MudGuard
Und ich hab die ganze Zeit "budweiser" gelesen. Bitte ein Bit! 😉 🍻
Das erste ist trinkbares Bier. Was ist das andere?
😷 LLAP
Hallo,
Bit! 😉 🍻
Was ist das?
Laut Wikipedia eine Birke!
Gruß
Kalk
@@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
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
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
die heißen jetzt nur noch „Bud“ ↩︎
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
@@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
@@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):
Na zdraví! 🍻
😷 LLAP
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
@@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
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
@@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
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
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
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
@@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
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
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
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
Hallo JürgenB,
sicher. Deswegen redeten Gunnar und ich ja auch ausführlich über das Thema Wortlänge.
Rolf
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
welche Versionen von OS, Browser, usw. sind den installiert?
Was sind den „usw.“?
Hello,
welche Versionen von OS, Browser, usw. sind den installiert?
Was sind den „usw.“?
"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
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.
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
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
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
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
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
@@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
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.
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
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