Math.clz32()

Статичний метод Math.clz32() повертає кількість старших нульових бітів 32-бітного бінарного представлення переданого числа.

Спробуйте його в дії

Синтаксис

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

Реалізація підрахунку старших одиниць, й не тільки

Наразі не існує статичного методу Math.clon – "Count Leading Ones" ("порахувати старші одиниці") (його звуть "clon", а не "clo", адже назва "clo" та "clz" – занадто схожі, особливо для неангломовних). Проте функцію clon можна легко створити, обернувши біти числа й передавши результат Math.clz32. Це спрацює, тому що значення, обернене до 1, – це 0, і навпаки. Отже, обернення всіх бітів оберне вимірювану кількість нулів (за допомогою Math.clz32), таким чином, змусивши Math.clz32 підрахувати число одиниць замість підрахунку числа нулів.

Припустімо, є таке 32-бітне слово:

const a = 32776; // 00000000000000001000000000001000 (16 старших нулів)
Math.clz32(a); // 16

const b = ~32776; // 11111111111111110111111111110111 (обернене 32776, 0 старших нулів)
Math.clz32(b); // 0 (цей результат дорівнює кількості старших одиниць у числі a)

Використавши цю логіку, можна створити функцію clon, як показано нижче:

const clz = Math.clz32;

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

Далі цей підхід можна розширити, створивши функцію "Count Trailing Zeros", так, як це показано нижче. Функція ctrz бере бітову кон'юнкцію між цілим числом та доповненням його двійки. Щодо того, як працює доповнення двійки, то всі молодші нулі перетворюються на одиниці, а коли потім додається 1, то вона переноситься до наймолодшого 0 (котрий у вихідному значенні був 1). Усі біти, старші за цей, залишаються такими ж і є оберненнями бітів вихідного числа. Таким чином, коли виконується бітова кон'юнкція з вихідним числом, то всі старші біти стають 0, що підраховується clz. Число молодших нулів, плюс перший біт 1, плюс старші біти, що були підраховані clz, сумарно дають 32.

function ctrz(integer) {
  integer >>>= 0; // звести до Uint32
  if (integer === 0) {
    // пропуск цього кроку змусив би функцію повернути -1
    return 32;
  }
  integer &= -integer; // рівносильно `int = int & (~int + 1)`
  return 31 - clz(integer);
}

Тож функцію "порахувати молодші одиниці" можна означити так:

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

Такі допоміжні функції можна оформити в модуль asm.js – для потенційного покращення швидкодії.

const countTrailsMethods = (function (stdlib, foreign, heap) {
  "use asm";
  const clz = stdlib.Math.clz32;
  // підрахувати молодші нулі
  function ctrz(integer) {
    integer = integer | 0; // звести до цілого числа
    if ((integer | 0) == 0) {
      // пропуск цього кроку змусив би функцію повернути -1
      return 32;
    }
    // Примітка: asm.js не має складених операторів присвоєння штибу &=
    integer = integer & -integer; // equivalent to `int = int & (~int + 1)`
    return (31 - clz(integer)) | 0;
  }
  // підрахувати молодші одиниці
  function ctron(integer) {
    integer = integer | 0; // звести до цілого числа
    return ctrz(~integer) | 0;
  }
  // asm.js вимагає простих об'єктів:
  return { ctrz: ctrz, ctron: ctron };
})(window, null, null);
const { ctrz, ctron } = countTrailsMethods;

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

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
clz32
Chrome Full support 38
Edge Full support 12
Firefox Full support 31
Internet Explorer No support Ні
Opera Full support 25
Safari Full support 7
WebView Android Full support 38
Chrome Android Full support 38
Firefox for Android Full support 31
Opera Android Full support 25
Safari on iOS Full support 7
Samsung Internet Full support 3.0
Deno Full support 1.0
Node.js Full support 0.12.0

Дивіться також