언어가 자바 스크립트는 것을 감안할 때, 입력이 < 1073741824
것을,에 상응 얻을 수있는 가장 빠른 방법은 무엇 : 내가 생각 해봤32의 거듭 제곱의 로그를 계산하는 가장 빠른 방법은 무엇입니까?
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/으로 측정)
[bit twiddling hack] (https://graphics.stanford.edu/~seander/bithacks.html#IntegerLog)은 어떻습니까? –
'if' 캐스케이드 접근 방식에 대해 잘못된 점이 있습니까? hacky 나 수학적으로 우아하지 않더라도 더 빠른 방법이나 더 적은 연산으로 상상할 수는 없습니다. (당신의 초기 가정에서, 입력은 항상 1073741824보다 작고, 최종 비교 연산조차 필요 없으며 'if'조건부 - 그냥 'return 5;'). – jez