react 源码里的函数之clz32

182 阅读1分钟
// TODO: This is pretty well supported by browsers. Maybe we can drop it.
  var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros.
  // Based on:
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32

  var log = Math.log;
  var LN2 = Math.LN2;

  function clz32Fallback(x) {
    var asUint = x >>> 0;

    if (asUint === 0) {
      return 32;
    }

    return 31 - (log(asUint) / LN2 | 0) | 0;
  }

clz32 函数来计算这个二进制数中前导零的数量。 有些浏览器不支持Math.clz32这个函数,所以就会用到clz32Fallbac这个函数。 Math.clz32()  函数返回一个数字在转换成 32 无符号整形数字的二进制形式后,开头的 0 的个数

1.var asUint = x >>> 0;是什么意思

>>>: 无符号右移操作符。它将数字的二进制表示向右移动指定的位数,右侧空出的位用零填充。无符号右移不关心符号位,它总是在左侧插入零。 0: 这里指定的右移的位数为0,实际上没有发生实质性的移动。但是通过使用无符号右移,JavaScript 引擎会将 x 强制转换为一个32位无符号整数。

31 - (log(asUint) / LN2 | 0) | 0 是什么意思

31 - (log(asUint) / LN2 | 0) | 0 的目的是计算一个二进制数字中前导零的数量,也就是二进制表示中从左边开始数第一个非零位前的零的数量。这是通过计算以 2 为底的对数,然后用 31 减去该对数的整数部分得到的。

这个计算的目的通常是为了确定一个数在二进制中的位数,或者说有效位数。