2015-01-20 3 views
0

64 비트 정수를 나타 내기 위해 R을 모았습니다. 이중을 사용해야합니다. 괜찮아요.하지만 Big Endian 64 비트 2의 보수 (java long)로 저장되는 바이너리 파일에서 정수를 읽어야합니다.R을 사용하여 이진 파일에서 64 비트 2의 보수를 읽는 방법?

내가 필요로하는 더블을 얻기 위해 나는 물론 그렇게

a = readBin(file, integer(), size=4, endian="big") 
b = readBin(file, integer(), size=4, endian="big") 

같은 4 개 바이트 덩어리에있는 두 개의 부호있는 정수를 읽을 수 있습니다하지만 그들을 R에 어떻게 결합 하는가?

+0

왜 이중으로 읽지 않으시겠습니까? – hadley

+0

double의 비트 표현은 64 비트 정수의 비트 표현과 다릅니다. 내가 double을 말할 때 명확히하기 위해 http://en.wikipedia.org/wiki/Double-precision_floating-point_format에서와 같이 배정도 부동 소수점을 의미합니다. 64 비트 정수의 경우 다음을 참조하십시오. http://en.wikipedia.org/wiki/Integer_%28computer_science%29 –

+0

2 배로 읽을 수는 있지만 원하는 값을 얻으려면 몇 가지 조작을해야합니다. 그것. 확실히 이것은 이전에 해결 된 문제입니다. –

답변

1

두 개 이상의 정수로 읽는 것이 좋습니다. 작은 양의 음수 (예 : -1)의 2의 보수 64 비트 표현은 배의 NaN이며, 산술 연산을 수행하면 필요한 방식대로 작동하지 않을 수 있습니다.

먼저 2의 보수 문제를 해결하십시오. 저는 a이 더 중요한 절반이라고 가정 할 것입니다. 음수이면 사실을 확인하고 정수의 2의 보수를 취합니다. 모든 비트를 뒤집은 다음 추가로 b에서 캐리를 추가하십시오. a에 추가하십시오.

다음으로 a을 double로 변환하고 2^32를 곱하고 b을 추가하십시오.

원래 값이 음수이면 결과를 무효화하십시오.

원래 숫자가 너무 크면 정확한 답변을 얻지 못할 수도 있습니다.

+0

답변을 주셔서 대단히 감사합니다. 나는 (예를 들어, 'a에서 더하기'를 'a add'에 더하는 것보다) 더하는 것을 이해할 수는 없지만, 읽히는 64 비트 정수가 실제로는 밀리 초 단위의 유닉스 타임 스탬프이고 그것이 될 것이라는 것을 깨달았다. 중요한 절반이 부정적이 될 때까지 미래로 수백만 년의 시간. 이런 이유로 저는 단순히 * 2^32 + b를 계산하여 작업에 성공했습니다. 그리고 지금은 숫자가 R의 유효한 정밀도 내에 있습니다. 그래서 이것은 저를 도왔습니다! –

+0

타임 스탬프 인 경우 2의 보수보다 부호가 없을 가능성이 높습니다.이 경우 'a * 2^32 + b'가 올바른 수식입니다. –