计算 32 次方的对数最快的方法是什么?
What's the fastest way to calculate log of a power of 32?
鉴于语言是 javascript,并且输入是 < 1073741824
,获得等效于:
的最快方法是什么
Math.floor(Math.log(len) / Math.log(32))
我试过 if:
if (len < 1024) return 1;
if (len < 32768) return 2;
if (len < 1048576) return 3;
if (len < 33554432) return 4;
if (len < 1073741824) return 5;
以及按位运算符:
// 0000000000000000000000000100000 // 32
// 0000000000000000000010000000000 // 1024
// 0000000000000001000000000000000 // 32768
// 0000000000100000000000000000000 // 1048576
// 0000010000000000000000000000000 // 33554432
// 1000000000000000000000000000000 // 1073741824
function log32(len) {
return (
0 +
!!(len >>> 30) +
!!(len >>> 25) +
!!(len >>> 20) +
!!(len >>> 15) +
!!(len >>> 10) +
!!(len >>> 5
)
}
有没有办法让这个更干净或更少的操作?
(性能测量:https://jsperf.com/log32-perf/)
我会选择非常有效的 Math.clz32
方法,该方法 return 是数字的 32 位二进制表示中前导零位的数量。
const log32 = x => Math.floor((31 - Math.clz32(x))/5);
console.log(log32(1023)); // 1
console.log(log32(1024)); // 2
这将 return 32 位范围内任何 x > 0 的正确值。
鉴于语言是 javascript,并且输入是 < 1073741824
,获得等效于:
Math.floor(Math.log(len) / Math.log(32))
我试过 if:
if (len < 1024) return 1;
if (len < 32768) return 2;
if (len < 1048576) return 3;
if (len < 33554432) return 4;
if (len < 1073741824) return 5;
以及按位运算符:
// 0000000000000000000000000100000 // 32
// 0000000000000000000010000000000 // 1024
// 0000000000000001000000000000000 // 32768
// 0000000000100000000000000000000 // 1048576
// 0000010000000000000000000000000 // 33554432
// 1000000000000000000000000000000 // 1073741824
function log32(len) {
return (
0 +
!!(len >>> 30) +
!!(len >>> 25) +
!!(len >>> 20) +
!!(len >>> 15) +
!!(len >>> 10) +
!!(len >>> 5
)
}
有没有办法让这个更干净或更少的操作? (性能测量:https://jsperf.com/log32-perf/)
我会选择非常有效的 Math.clz32
方法,该方法 return 是数字的 32 位二进制表示中前导零位的数量。
const log32 = x => Math.floor((31 - Math.clz32(x))/5);
console.log(log32(1023)); // 1
console.log(log32(1024)); // 2
这将 return 32 位范围内任何 x > 0 的正确值。