计算32次幂记录的最快方法是什么?

时间:2017-04-19 20:10:10

标签: javascript bit-manipulation bitwise-operators bit-shift persistent-data

鉴于语言是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/

1 个答案:

答案 0 :(得分:4)

我会选择非常高效的Math.clz32方法,该方法返回数字的32位二进制表示中的前导零位数。

&#13;
&#13;
const log32 = x => Math.floor((31 - Math.clz32(x))/5);

console.log(log32(1023)); // 1
console.log(log32(1024)); // 2
&#13;
&#13;
&#13;

这将返回任何x&gt;的正确值。在32位范围内为0。