Wie mache ich bitweise UND in Javascript für Variablen, die länger als 32 Bit sind?

Lesezeit: 1 Minute

Wie mache ich bitweise UND in Javascript fur Variablen die
Oleg D.

Ich habe 2 Zahlen in Javascript, die ich biten möchte und. Sie sind beide 33bit lang

in c#:

 ((4294967296 & 4294967296 )==0) is false

aber in Javascript:

 ((4294967296 & 4294967296 )==0) is true

4294967296 ist ((lang)1) << 32

Wie ich es verstehe, liegt dies an der Tatsache, dass Javascript Werte in int32 konvertiert, wenn bitweise Operationen ausgeführt werden.

Wie kann ich das umgehen? Irgendwelche Vorschläge zum Ersetzen von Bits und einer Reihe anderer mathematischer Operationen, damit Bits nicht verloren gehen?

  • Hooking stackoverflow.com/q/2983206/632951

    – Schrittmacher

    6. August ’17 um 23:20

Hier ist eine lustige Funktion für beliebig große ganze Zahlen:

function BitwiseAndLarge(val1, val2) {
    var shift = 0, result = 0;
    var mask = ~((~0) << 30); // Gives us a bit mask like 01111..1 (30 ones)
    var divisor = 1 << 30; // To work with the bit mask, we need to clear bits at a time
    while( (val1 != 0) && (val2 != 0) ) {
        var rs = (mask & val1) & (mask & val2);
        val1 = Math.floor(val1 / divisor); // val1 >>> 30
        val2 = Math.floor(val2 / divisor); // val2 >>> 30
        for(var i = shift++; i--;) {
            rs *= divisor; // rs << 30
        }
        result += rs;
    }
    return result;
}

Vorausgesetzt, das System handhabt mindestens 30-Bit-Bitweise-Operationen richtig.

  • Genial! Hast du eine Funktion für bitweise oder auch?

    – arao6

    17. Okt ’14 um 23:12

  • Aus dem Kopf, ich denke du würdest einfach die Single wechseln & zu einem |: var rs = (mask & val1) & (mask & val2); zu var rs = (mask & val1) | (mask & val2);.

    – palswim

    20. Okt. 14 um 21:58 Uhr

  • Tolle Funktion, aber ich konnte es nicht mit 32 Bit oder mehr zum Laufen bringen.

    – Bounav

    20. Okt ’16 um 14:34

  • Danke, aber würde die Funktion, die nicht wie beworben funktioniert, nicht eine Ablehnung verdienen? Welche Operationen funktionieren nicht (wie die Werte von val1 und val2, und das Ergebnis der Funktion zusammen mit dem Wert, den Sie von der Funktion erwarten)?

    – palswim

    20. Okt ’16 um 18:20

  • @palswim, tolle Lösung

    – Mahmoud Saleh

    2. Apr. ’18 um 6:03

Wie mache ich bitweise UND in Javascript fur Variablen die
Hieronymus

Sie könnten jede der Variablen in 2 32-Bit-Werte aufteilen (wie ein High-Word und ein Low-Wort) und dann eine bitweise Operation für beide Paare durchführen.

Das folgende Skript wird als Windows .js-Skript ausgeführt. Sie können WScript.Echo() durch alert() für das Web ersetzen.

var a = 4294967296;
var b = 4294967296;

var w = 4294967296; // 2^32

var aHI = a / w;
var aLO = a % w;
var bHI = b / w;
var bLO = b % w;

WScript.Echo((aHI & bHI) * w + (aLO & bLO));

  • Können Sie ein Beispiel für die Aufteilung nennen? Danke!

    – Oleg D.

    3. September ’10 um 16:46

  • Dringender Hinweis – Sie müssen daran denken, dass Javascript keine echten 64-Bit-Werte in einer Zahl unterstützt, maximal 53 Bit. Weil es float64 (double) verwendet, um mit jeder Ganzzahl zu arbeiten. Siehe auch stackoverflow.com/a/45425630/1848217

    – Flammensturm

    31. Juli ’17 um 21:38

  • Dies schlägt immer noch für Werte um -2^32 fehl (aber nicht genau -2^32). Dafür konnte ich keine Lösung finden. Abrunden der hi Teil funktioniert nur für wenige Werte. hi neigt dazu, bei -1 zu bleiben, wenn es -2 oder so sein sollte.

    – ygoe

    11. Juni ’18 um 15:33

  • Ich habe einen Schnelltest in Javascript gemacht, er funktioniert nicht auf a=114287881752716 b=0x0ffffffffff0000

    – d_air

    8. September ’20 um 9:13


1641849979 243 Wie mache ich bitweise UND in Javascript fur Variablen die
HoLyVieR

Es gibt mehrere BigInteger-Bibliotheken in Javascript, aber keine von ihnen bietet eine bitweise Operation, die Sie derzeit benötigen. Wenn Sie motiviert sind und diese Funktionalität wirklich benötigen, können Sie eine dieser Bibliotheken ändern und eine Methode dazu hinzufügen. Sie bieten bereits eine gute Codebasis, um mit großen Zahlen zu arbeiten.

Eine Liste der BigInteger-Bibliothek in Javascript finden Sie in dieser Frage:

Riesige Integer-JavaScript-Bibliothek

Das einfachste bitweise UND, das bis zur maximalen Anzahl von JavaScript funktioniert

Der maximale Integer-Wert von JavaScript ist aus internen Gründen 2^53 (es ist eine doppelte Gleitkommazahl). Wenn Sie mehr benötigen, gibt es gute Bibliotheken für den Umgang mit großen Integern.

2^53 ist 9.007.199.254.740.992 oder etwa 9.000 Billionen (~9 Billiarden).

// Works with values up to 2^53
function bitwiseAnd_53bit(value1, value2) {
    const maxInt32Bits = 4294967296; // 2^32

    const value1_highBits = value1 / maxInt32Bits;
    const value1_lowBits = value1 % maxInt32Bits;
    const value2_highBits = value2 / maxInt32Bits;
    const value2_lowBits = value2 % maxInt32Bits;
    return (value1_highBits & value2_highBits) * maxInt32Bits + (value1_lowBits & value2_lowBits)
}

.

335980cookie-checkWie mache ich bitweise UND in Javascript für Variablen, die länger als 32 Bit sind?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy