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 |
См. также
© 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