2010-04-04 4 views
6

나는 자바에을 포팅해야한다. JavaScript의 비트 연산자를 충분히 큰 숫자로 사용하면 성능이 크게 떨어지고 부정확하다. 일부 대담한 연구에서는 "JavaScript의 비트 연산자는 본질적으로 속도가 느립니다"라고 말합니다. 내부적으로 JavaScript가 비트 값 연산을 수행하기 위해 JavaScript의 두 값을 모두 부호있는 32 비트 정수로 변환하기 때문입니다 (이에 대해서는 see here). , Java 난수 생성기의 직접 포트를 수행 할 수 없으며 Java.util.Random()과 같은 숫자 결과를 가져와야합니다. 자바 스크립트가 정수에 그 크기를 비트 연산을 할 수 없기 때문에, 제대로 작동하지 않습니다 코드합니다 (Java.util.Random()의 거의-직접 포트입니다)Javascript에서 48 비트 비트 연산?

this.next = function(bits) { 
    if (!bits) { 
     bits = 48; 
    } 
    this.seed = (this.seed * 25214903917 + 11) & ((1 << 48) - 1); 
    return this.seed >>> (48 - bits); 
    }; 

같은 것을 쓰기.)

나 ' Lehmer 알고리즘을 사용하여 32 비트 공간에서 시드 가능한 난수 생성기를 만들 수 있다는 것을 알았지 만 트릭은 Java.util.Random()과 동일한 값을 가져와야한다는 것입니다. 보다 빠르고 기능적인 포트를 만들기 위해 무엇을해야합니까?

답변

0

48 비트 비트 연산은 JavaScript에서 불가능합니다. 두 개의 숫자를 사용하여 시뮬레이션 할 수 있습니다.

0

대안은 부울 값 48 불린의 배열을 사용하고 직접 변속을 구현하는 것입니다. 비록 이것이 더 빠르면 나는 모른다. 하지만 모든 불리언은 복식으로 저장되기 때문에 의심 스럽습니다.

0

베어 비트 시프트 2.

1 << x == 1 * Math.pow(2,x) 

그것은 비트 시프트보다 느린의 힘으로 곱셈 또는 나눗셈 직접 동등하지만, 32 비트 이상으로 연장 할 수 있도록 유의한다. bits > 32에 대한 더 빠른 해결책이 될 수 있습니다. 더 높은 비트 수를 지원해야하는 추가 코드를 고려한 후에는 프로파일 링을 수행해야합니다.

4

foo & ((1 << 48) - 1) 대신 foo % Math.pow(2,48)을 사용할 수 있습니다.

자바의 모든 숫자는 64 비트 부동 소수점 숫자로, 48 비트 정수를 나타내는 데 충분합니다.