【发布时间】:2017-04-19 20:10:10
【问题描述】:
鉴于语言是 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/)
【问题讨论】:
-
您认为您的
if级联方法有什么问题?我无法想象一种更快的方式,或者一种更少操作的方式,即使它看起来很老套或在数学上不优雅。 (顺便说一句,考虑到您的初始假设,即输入始终小于 1073741824,您甚至不需要最终的比较操作,if有条件——只需return 5;即可。)
标签: javascript bit-manipulation bitwise-operators bit-shift persistent-data