Spec-Zone.ru › JavaScript

Math.clz32()

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.

Статический метод Math.clz32() возвращает количество ведущих нулевых битов в 32-битной двоичной репрезентации числа.

Попробуйте

// 00000000000000000000000000000001
console.log(Math.clz32(1));
// Expected output: 31

// 00000000000000000000000000000100
console.log(Math.clz32(4));
// Expected output: 29

// 00000000000000000000001111101000
console.log(Math.clz32(1000));
// Expected output: 22

Синтаксис

Math.clz32(x)

Параметры

x
Число.

Возвращаемое значение

Количество ведущих нулевых битов в 32-битной двоичной репрезентации x.

Описание

clz32 — это сокращение от CountLeadingZeros32 (Подсчет ведущих нулей 32).

Если x не является числом, оно будет сначала преобразовано в число, а затем в 32-битное беззнаковое целое число.

Если преобразованное 32-битное беззнаковое целое число равно 0, возвращается 32, потому что все биты равны 0. Если самый старший бит равен 1 (т. е. число больше или равно 231), возвращается 0.

Эта функция особенно полезна для систем, которые компилируются в JS, таких как Emscripten.

Примеры

Использование Math.clz32()

Math.clz32(1); // 31
Math.clz32(1000); // 22
Math.clz32(); // 32

const stuff = [
  NaN,
  Infinity,
  -Infinity,
  0,
  -0,
  false,
  null,
  undefined,
  "foo",
  {},
  [],
];
stuff.every((n) => Math.clz32(n) === 32); // true

Math.clz32(true); // 31
Math.clz32(3.5); // 30

Реализация Count Leading Ones и других подобных функций

В настоящее время нет Math.clon для "Подсчета ведущих единиц" (названной "clon", а не "clo", потому что "clo" и "clz" слишком похожи, особенно для неанглоязычных людей). Однако clon функцию можно легко создать, инвертировав биты числа и передав результат в Math.clz32. Это сработает, потому что инверсия 1 равна 0, и наоборот. Таким образом, инвертирование битов инвертирует измеряемое количество нулей (из Math.clz32), благодаря чему Math.clz32 подсчитывает количество единиц вместо подсчета количества нулей.

Рассмотрим следующее 32-битное слово:

const a = 32776; // 00000000000000001000000000001000 (16 leading zeros)
Math.clz32(a); // 16

const b = ~32776; // 11111111111111110111111111110111 (32776 inverted, 0 leading zeros)
Math.clz32(b); // 0 (this is equal to how many leading one's there are in a)

Используя эту логику, clon функцию можно создать следующим образом:

const clz = Math.clz32;

function clon(integer) {
  return clz(~integer);
}

Кроме того, этот метод можно расширить для создания функции "Подсчет trailing zeros" без прыжков, как показано ниже. Функция ctrz принимает побитовое И целого числа с его дополнительным кодом. Благодаря принципу работы дополнительного кода, все trailing zeros будут преобразованы в единицы, а затем при добавлении 1 произойдет перенос до тех пор, пока не будет достигнут первый 0 (который изначально был 1). Все биты выше этого останутся прежними и будут инверсией битов исходного целого числа. Следовательно, при выполнении побитового И с исходным целым числом все более высокие биты станут 0, которые можно подсчитать с помощью clz. Количество trailing zeros, плюс первый 1 бит, плюс ведущие биты, подсчитанные clz, в сумме дают 32.

function ctrz(integer) {
  integer >>>= 0; // coerce to Uint32
  if (integer === 0) {
    // skipping this step would make it return -1
    return 32;
  }
  integer &= -integer; // equivalent to `int = int & (~int + 1)`
  return 31 - clz(integer);
}

Затем мы можем определить функцию "Подсчет trailing ones" следующим образом:

function ctron(integer) {
  return ctrz(~integer);
}

Эти вспомогательные функции можно превратить в модуль asm.js для потенциального улучшения производительности.

const countTrailsMethods = (function (stdlib, foreign, heap) {
  "use asm";
  const clz = stdlib.Math.clz32;

  // count trailing zeros
  function ctrz(integer) {
    integer = integer | 0; // coerce to an integer
    if ((integer | 0) == 0) {
      // skipping this step would make it return -1
      return 32;
    }
    // Note: asm.js doesn't have compound assignment operators such as &=
    integer = integer & -integer; // equivalent to `int = int & (~int + 1)`
    return (31 - clz(integer)) | 0;
  }

  // count trailing ones
  function ctron(integer) {
    integer = integer | 0; // coerce to an integer
    return ctrz(~integer) | 0;
  }

  // asm.js demands plain objects:
  return { ctrz: ctrz, ctron: ctron };
})(window, null, null);

const { ctrz, ctron } = countTrailsMethods;

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-math.clz32

Совместимость с браузерами

Настольные компьютеры Мобильные устройства Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
clz32
38
12
31
25
7
38
31
25
7
3.0
38
7
1.0.0
1.0
0.12.0

См. также

  • Polyfill of Math.clz32 in core-js
  • es-shims polyfill of Math.clz32
  • Math
  • Math.imul

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API