Math.clz32()

基线 广泛可用

此功能已建立良好,可在许多设备和浏览器版本中使用。它自 2015 年 7 月.

报告反馈

试一试

语法

**Math.clz32()** 静态方法返回数字的 32 位二进制表示中的前导零位数。
Math.clz32(x)

js

参数

x

一个数字。

返回值

描述

x 的 32 位二进制表示中的前导零位数。

clz32 是 **C**ount **L**eading **Z**eros **32** 的缩写。

如果 x 不是数字,它将首先转换为数字,然后转换为 32 位无符号整数。

如果转换后的 32 位无符号整数为 0,则返回 32,因为所有位都是 0。如果最高有效位为 1(即数字大于或等于 231),则返回 0

示例

此函数对于编译到 JS 的系统(如 Emscripten)特别有用。

**Math.clz32()** 静态方法返回数字的 32 位二进制表示中的前导零位数。
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.clz32()

实现前导一计数及更多

目前,没有用于“前导一计数”的 Math.clon(命名为“clon”,而不是“clo”,因为“clo”和“clz”太相似,尤其是对于非英语人士)。但是,可以轻松地通过反转数字的位并将结果传递给 Math.clz32 来创建 clon 函数。这样做将起作用,因为 1 的反转是 0,反之亦然。因此,反转位将反转测量的 0 的数量(来自 Math.clz32),从而使 Math.clz32 计数 1 的数量,而不是计数 0 的数量。

**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)

考虑以下 32 位字

**Math.clz32()** 静态方法返回数字的 32 位二进制表示中的前导零位数。
const clz = Math.clz32;

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

使用此逻辑,可以创建 clon 函数,如下所示

**Math.clz32()** 静态方法返回数字的 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);
}

此外,此技术可以扩展为创建无跳转的“尾随零计数”函数,如下所示。ctrz 函数对整数与其二进制补码进行按位与运算。通过二进制补码的工作原理,所有尾随零都将转换为一,然后在加 1 时,它将一直进位到第一个 0(最初是 1)为止。高于此位的位保持不变,并且是原始整数位的反转。因此,当对原始整数进行按位与运算时,所有更高位都变为 0,可以使用 clz 计数。尾随零的数量加上第一个 1 位加上 clz 计数的前导位总计为 32。

**Math.clz32()** 静态方法返回数字的 32 位二进制表示中的前导零位数。
function ctron(integer) {
  return ctrz(~integer);
}

然后我们可以定义一个“尾随一计数”函数,如下所示

**Math.clz32()** 静态方法返回数字的 32 位二进制表示中的前导零位数。
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;

规范

这些辅助函数可以被制作成 asm.js 模块,以实现潜在的性能提升。
规范
# ECMAScript 语言规范

浏览器兼容性

sec-math.clz32

另请参阅