// 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 减去该对数的整数部分得到的。
这个计算的目的通常是为了确定一个数在二进制中的位数,或者说有效位数。