Signatur
Beschreibung
Math.clz32() ist eine statische Methode des Math-Objekts. Sie wandelt ihr Argument zuerst in eine 32-Bit-Ganzzahl ohne Vorzeichen um (intern mit der Operation ToUint32). Danach zählt sie, wie viele Nullbits vor dem ersten gesetzten Bit stehen. Das Ergebnis ist immer eine Ganzzahl zwischen 0 und 32. Bei 0 erhält man 32, bei negativen Zahlen 0, weil dort das höchste Bit gesetzt ist.
Die Methode ist für schnelle Bit-Operationen gedacht. Moderne JavaScript-Engines übersetzen sie meist direkt in einen einzigen Prozessorbefehl (z. B. LZCNT oder CLZ). Typische Einsatzfälle:
- Bitlänge einer Zahl bestimmen:
32 - Math.clz32(n) - Ganzzahligen Zweierlogarithmus berechnen:
31 - Math.clz32(n) - Nächste Zweierpotenz finden, z. B. für Puffergrößen oder Hash-Tabellen
- Effizient mit Bitmasken, Bitsets und Komprimierungsverfahren arbeiten, oder Code aus C/C++ bzw. WebAssembly (asm.js) übertragen
Es gibt kein direktes Gegenstück für führende Einsen oder für Nullbits am Ende. Beide lassen sich aber mit Bitoperatoren nachbauen: führende Einsen mit Math.clz32(~x), Nullbits am Ende mit 31 - Math.clz32(x & -x).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $x Pflicht | number | Die zu untersuchende Zahl. Andere Typen werden erst in eine Zahl umgewandelt, danach mit ToUint32 in eine 32-Bit-Ganzzahl ohne Vorzeichen: Nachkommastellen fallen weg, größere Werte werden modulo 232 umgebrochen. NaN und ±Infinity werden zu 0. |
Rückgabewert
0 bis 32. Ist der umgewandelte Wert 0, ist das Ergebnis 32.Beispiele
Grundlegende Werte und Typumwandlung
console.log(Math.clz32(1)); // 0b1 → 31 führende Nullen
console.log(Math.clz32(1000)); // 10 Bits belegt
console.log(Math.clz32(0)); // kein Bit gesetzt
console.log(Math.clz32(-1)); // 0xFFFFFFFF
console.log(Math.clz32(3.9)); // Nachkommastellen fallen weg → 3
console.log(Math.clz32('12')); // String wird zu 12 = 0b1100
console.log(Math.clz32(NaN)); // NaN → 0
console.log(Math.clz32(2 ** 32)); // Umbruch → 0
Bitlänge und ganzzahliger Zweierlogarithmus
const bitLength = (n) => 32 - Math.clz32(n);
const log2Floor = (n) => 31 - Math.clz32(n);
for (const n of [1, 255, 256, 1_000_000]) {
console.log(`${n}: ${bitLength(n)} Bits, log2 = ${log2Floor(n)}`);
}
Nächste Zweierpotenz für eine Puffergröße
// Rundet auf die nächste Zweierpotenz auf (gültig für 1 bis 2^31)
const nextPowerOfTwo = (n) => (n <= 1 ? 1 : 2 ** (32 - Math.clz32(n - 1)));
const sizes = [1, 16, 17, 1000];
console.log(sizes.map(nextPowerOfTwo));
const buffer = new ArrayBuffer(nextPowerOfTwo(1000));
console.log(buffer.byteLength);
Führende Einsen und Nullbits am Ende nachbauen
// Führende Einsen: Bits umkehren, dann Nullen zählen
const clo32 = (x) => Math.clz32(~x);
// Nullbits am Ende: niedrigstes gesetztes Bit isolieren
const ctz32 = (x) => (x === 0 ? 32 : 31 - Math.clz32(x & -x));
console.log(clo32(0xF0000000)); // 1111 0000 ...
console.log(ctz32(8)); // 0b1000
console.log(ctz32(96)); // 0b1100000
// Wichtig · Fallstricke
- Nur 32 Bit: Werte ab 232 werden modulo 232 umgebrochen.
Math.clz32(2 ** 32)ergibt deshalb32, nicht0. Für größere Ganzzahlen nimmt manBigInt, z. B. mitn.toString(2).length. - Nicht mit 0 rechnen: Für
0,NaN,Infinityund Werte zwischen 0 und 1 wird die Zahl zu0und das Ergebnis ist32. Formeln wie31 - Math.clz32(n)liefern dann-1. Solche Fälle sollte man vorher gesondert behandeln. - Negative Zahlen ergeben immer
0, weil ihr höchstes Bit in der Zweierkomplement-Darstellung gesetzt ist. - Es gibt kein
Math.clz64(), und die Methode akzeptiert keinBigInt:Math.clz32(1n)wirft einenTypeError. - Die Methode ist in allen modernen Browsern und in Node.js verfügbar (Baseline). Nur sehr alte Umgebungen wie der Internet Explorer brauchen eine Ersatzimplementierung (Polyfill), z. B. mit
31 - Math.floor(Math.log2(x >>> 0))und einer Sonderbehandlung für0.