main
js 27 lines 705 Bytes
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @flow
8 */
9
10 // TODO: This is pretty well supported by browsers. Maybe we can drop it.
11
12 export const clz32: (x: number) => number = Math.clz32
13 ? Math.clz32
14 : clz32Fallback;
15
16 // Count leading zeros.
17 // Based on:
18 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
19 const log = Math.log;
20 const LN2 = Math.LN2;
21 function clz32Fallback(x: number): number {
22 const asUint = x >>> 0;
23 if (asUint === 0) {
24 return 32;
25 }
26 return (31 - ((log(asUint) / LN2) | 0)) | 0;
27 }