考虑到语言是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
条件语句,只需返回5就可以了。) - jez