2012-10-29 3 views
0

일부 C++ 코드를 Java 코드로 이식하고 있습니다.java long 데이터 유형을 부호없는 값으로 변환

Java에서 64 비트를 저장할 수있는 부호없는 데이터 유형이 없습니다.

자바의 long 데이터 형식 (물론 서명 됨)에 저장된 해시 코드가 있습니다.

long vp = hashcode/38; // hashcode is of type 'long' 

여기서 38은 2보다 크므로, 결과 숫자는 java의 다른 산술에 안전하게 사용할 수 있습니다.

'hashcode'의 부호있는 비트가 1로 설정되면 질문이 생깁니다. 변수 vp에 음수 값을 넣고 싶지 않습니다. 데이터 유형이 부호없는 것 인 것처럼 긍정적 인 값을 원했습니다.

P .: 성능 문제로 인해 Biginteger를 사용하고 싶지 않습니다.

+0

나는 당신의 질문을 이해하지 못한다. 철자를 확인하십시오. –

+0

2의 보수 64 비트입니다. ([spec] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html) – ignis

+0

C++에서 얻은 정확한 값을 다시 얻어야합니까? – EJP

답변

5

Java의 프리미티브 정수형은 서명 된 것으로 간주되며 실제로 수행 할 수있는 것은 없습니다. 그러나, 당신이 그것을 위해 필요한 것에 따라, 이것은 중요하지 않을 수 있습니다.

정수는 모두 2의 보수로 이루어 지므로 부호가 있고 부호가 없으므로 이진 수준이 동일합니다. 차이점은 이들을 해석하는 방법과 특정 작업에서입니다. 특히 오른쪽 시프트, 나누기, 모듈러스 및 비교가 다릅니다. 서명되지 않은 오른쪽 시프트는 >>> 연산자를 사용하여 수행 할 수 있습니다. 누락 된 연산자 중 하나가 필요하지 않으면 long을 완벽하게 사용할 수 있습니다.

+0

이 경우에는 구분이 필요합니다. 내 데이터 유형에 저장된 값은 '1'로 설정된 부호있는 (MSB) 비트를 가질 수 있습니다. 이 문제를 해결할 방법이 있습니까? – user982845

+0

Java의 유연하지 않은 구문 덕분에이 작업을 수행 할 수있는 좋은 방법이 없습니다. 그러나 그것을하는 몇몇 추악한 방법이있다. 1) bignum 유형을 사용하십시오. 2) 사용자 지정 나누기 함수 사용 – Antimony

1

타사 라이브러리를 사용할 수 있다면 다음과 같이 할 수 있습니다. Guava의 UnsignedLongs 클래스를 사용하여 division을 포함하여 많은 목적으로 long 값을 부호없는 것으로 처리하십시오. (공개 : 구아바에 기고합니다.)

0

글쎄, 여기 어떻게 해결 했나. 해시 코드를 1 비트 씩 오른쪽으로 이동합니다 (2로 나누기). 그런 다음 오른쪽으로 이동 한 숫자를 19로 나눕니다 (38/2). 그래서 본질적으로 저는 C++로 수행되는 것과 정확히 같은 수를 38로 나누었습니다. 나는 C++에서 얻은 것과 같은 가치를 가지고있다.

관련 문제