diff --git a/Bit-Manipulation/LogTwo.js b/Bit-Manipulation/LogTwo.js new file mode 100644 index 0000000000..844a7ac5e5 --- /dev/null +++ b/Bit-Manipulation/LogTwo.js @@ -0,0 +1,14 @@ +/** + * https://handwiki.org/wiki/Binary_logarithm + * Approximate log2 using only bitwise operators + * @param {number} n + * @returns {number} Log2 approximation equal to floor(log2(n)) + */ +export const logTwo = (n) => { + let result = 0 + while (n >> 1) { + n >>= 1 + result++ + } + return result +} diff --git a/Bit-Manipulation/test/LogTwo.test.js b/Bit-Manipulation/test/LogTwo.test.js new file mode 100644 index 0000000000..e811f29b23 --- /dev/null +++ b/Bit-Manipulation/test/LogTwo.test.js @@ -0,0 +1,7 @@ +import { logTwo } from '../LogTwo' + +for (let i = 1; i < 100; i++) { + test('log2(' + i + ')', () => { + expect(logTwo(i)).toBe(Math.floor(Math.log2(i))) + }) +}