2009-12-19 7 views
4

나는 부호없는 정수의 32 비트 나눗셈을 수행 할 것을 요구하는 인터프리터를 작성했다. Java에서이 작업을 수행 할 수 있습니다.캐스팅하지 않고 Java 서명되지 않은 부분?

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

그러나 int로 변환하는 것을 피하고 싶습니다. Java는 이미 부호없는 오른쪽 시프트 연산자 >>>을 해당 특수한 경우에 제공하므로 같은 방법으로 부호없는 나누기를 수행하는 영리한 방법이있을 수 있습니다.

2 개의 칭찬 번호가 작동하기 때문에 추가 및 곱하기가 잘 작동합니다.

Java에서 더 좋은 방법이 있나요?

답변

1

글쎄, 1 비트 아래로 이동하면 결과 두 숫자를 나눌 수 있습니다 (결과 숫자가 4 배 작아 지므로). 그러나 그것은 짝수에 대해서만 작용할 것입니다. 왜냐하면 당신이 최하위 비트를 잃을 것이기 때문입니다.

나는 그 상태를 확인할 때마다 시간을 절약 할 수 있다고 생각하지 않습니다. 임의의 크기의 정수에서 작동 당신은 항상 BigInteger을 사용 할 수

-1

, (2 31보다 작은 숫자를 확인),하지만 long에 홍보하는 것보다 훨씬 더 비싼하고 int로 다시 던졌다. 퍼포먼스를 향상시키려는 의도인가? (따라서 캐스팅 시간을 피하기 위해 "순수한 정수"솔루션을 원한다.) 또는 코드가 얼마나 읽기 쉽고/이해할 수 있는지를 향상 시키는가? (BigInteger가 더 낫지는 않을까?)

관련 문제