5

Is there bitwise solution to find the index of first set bit in mask with only one bit set? e.g. for 8 it would be 3, for 16 => 4 and so on. No loops plz. The best solution I can come up with is to createa map of bit to index.

2 Answers2

5
function firstBit(x) {
    return Math.floor(
        Math.log(x | 0) / Math.log(2)
    ) + 1;
}
i=4; console.log(i.toString(2), firstBit(i)); // 100 3
i=7; console.log(i.toString(2), firstBit(i)); // 111 3
i=8; console.log(i.toString(2), firstBit(i)); // 1000 4
Paul S.
  • 64,864
  • 9
  • 122
  • 138
3

For posterity, ES6 introduced Math.log2 (and also log10) which does exactly that:

Math.log2(8) === 3

As a reminder, logA(x) is logB(x) / logB(A) for any A and B

floribon
  • 19,175
  • 5
  • 54
  • 66