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