问题
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.
回答1:
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
回答2:
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
来源:https://stackoverflow.com/questions/18134985/how-to-find-index-of-first-set-bit