Math.clz32 / imul în JavaScript

Numere și matematică ES2015 (ES6)

Operații pe întregi de 32 de biți: numărul de zerouri din față și înmulțirea cu depășire.

Sintaxă
Math.clz32(x)
Math.imul(a, b)

Ce face Math.clz32 / imul

Math.clz32 (count leading zeros) transformă numărul într-un întreg fără semn pe 32 de biți și returnează câte zerouri are la stânga în scrierea binară. Pentru 0 returnează 32.

Math.imul înmulțește două numere ca întregi pe 32 de biți, cu depășire, cum ar face limbajul C. Se folosește în funcții de hash și în cod compilat (asm.js, WebAssembly).

Parametri

Parametru Descriere
x Pentru clz32: numărul.
a, b Pentru imul: cele două numere înmulțite.

Ce returnează

Un număr întreg.

Exemple

Exemplul 1: Zerouri din față

for (const n of [1, 8, 255, 0]) {
  console.log(n, n.toString(2).padStart(32, "0").slice(-12), Math.clz32(n));
}

Rezultat

1 000000000001 31
8 000000001000 28
255 000011111111 24
0 000000000000 32

Exemplul 2: Înmulțire pe 32 de biți și un hash simplu

console.log(Math.imul(3, 4));
console.log(Math.imul(0xffffffff, 5), 0xffffffff * 5);

function hash(text) {
  let h = 0;
  for (const c of text) h = Math.imul(31, h) + c.codePointAt(0) | 0;
  return h;
}
console.log(hash("Iași"), hash("Cluj"));

Rezultat

12
-5 21474836475
2284712 2103518

Greșeli frecvente

  • Folosești Math.imul pentru înmulțiri obișnuite. Pentru numere mari rezultatul este tăiat la 32 de biți și iese complet diferit.

Comenzi înrudite