Портировано / адаптировано из этого ответа , это хороший, не требующий строк, l oop и условно свободный способ получения позиции MSB или LSB из BigInt.
const deBruijn = [0, 48, -1, -1, 31, -1, 15, 51, -1, 63, 5, -1, -1, -1, 19, -1, 23, 28, -1, -1, -1, 40, 36, 46, -1, 13, -1, -1, -1, 34, -1, 58, -1, 60, 2, 43, 55, -1, -1, -1, 50, 62, 4, -1, 18, 27, -1, 39, 45, -1, -1, 33, 57, -1, 1, 54, -1, 49, -1, 17, -1, -1, 32, -1, 53, -1, 16, -1, -1, 52, -1, -1, -1, 64, 6, 7, 8, -1, 9, -1, -1, -1, 20, 10, -1, -1, 24, -1, 29, -1, -1, 21, -1, 11, -1, -1, 41, -1, 25, 37, -1, 47, -1, 30, 14, -1, -1, -1, -1, 22, -1, -1, 35, 12, -1, -1, -1, 59, 42, -1, -1, 61, 3, 26, 38, 44, -1, 56];
const multiplicator = BigInt("0x6c04f118e9966f6b");
const
b1 = BigInt(1),
b2 = BigInt(2),
b4 = BigInt(4),
b8 = BigInt(8),
b16 = BigInt(16),
b32 = BigInt(32),
b57 = BigInt(57);
function msb(v) {
v |= v >> b1;
v |= v >> b2;
v |= v >> b4;
v |= v >> b8;
v |= v >> b16;
v |= v >> b32;
return deBruijn[
BigInt.asUintN(
64,
(BigInt.asUintN(
64,
(v * multiplicator))) >> b57)
];
}
function lsb(v) {
v = -v | v;
return deBruijn[
BigInt.asUintN(
64,
(BigInt.asUintN(
64,
(~(v) * multiplicator))) >> b57)
];
}
console.log(lsb(BigInt(18)))
console.log(msb(BigInt(18)))