문제

나는 서명되지 않은 정수의 32 비트 부서를 수행 해야하는 통역사를 작성했습니다. Java에서는 다음과 같이 할 수 있습니다.

reg[a] = (int) ((reg[b] & 0xFFFFFFFFL) / (reg[c] & 0xFFFFFFFFL));

그러나 나는 int로 Long과 Back으로 전환하는 것을 피하고 싶습니다. Java는 이미 서명되지 않은 올바른 시프트 연산자에게 제공합니다 >>> 그 특별한 경우에는 같은 방식으로 서명되지 않은 분열을하는 영리한 방법이있을 수 있습니다.

두 사람의 칭찬 숫자는 작동하므로 추가 및 곱셈은 잘 작동합니다.

Java가 이것을하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

글쎄, 당신이 하나의 비트로 이동하면, 당신은 결과적으로 두 숫자를 나누고 두 번 증가 할 수 있습니다 (결과 숫자는 4 배 더 작기 때문에). 그러나 그것은 당신이 가장 중요한 비트를 잃을 것이기 때문에 짝수에만 작동합니다.

나는 그것이 그 상태를 확인하기 위해 시간을 절약 할 것이라고 생각하지 않습니다. (또는 2보다 작은 숫자를 확인하십시오31)

다른 팁

당신은 항상 사용할 수 있습니다 BigInteger, 임의 크기의 정수에서 작동하지만 홍보하는 것보다 훨씬 비싸다. long 그리고 다시 캐스트 int. 성능을 향상시키려는 의도 (따라서 캐스트의 시간을 피하기 위해 "순수한 정수"솔루션을 원하거나 코드가 얼마나 읽을 수 있고 이해할 수 있는지를 향상시키려는 의도가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top