2017-10-11 2 views
0

에 32 비트 데이터를 변환합니다.나는 이런 식으로 뭔가를 부호없는 long 값

int[] r = { 4123, 2571 }; 
long result = ((r[1] & 0xFFFF) << 16 | (rs[0] & 0xFFFF)); 
System.out.prinln(result); 

이 출력이되어야합니다 : 이 내 시도

편집 ... 10,111,627하지만 168497179.는 아마 내가 변환에 뭔가를 그리워하지만 생각이없는 얻을

이것은 값이 32 비트 레지스터에 배치되는 방법의 예입니다.

+1

10111627은 내가 어떻게 보든 4123과 2571로 구성되지 않았습니다. 16 진수에서는 작은 부분이 0x101b와 0x0a0b이므로, 0x009a4a8b로 변환 할 수 없습니다. 출력 결과를 어떻게 알 수 있습니까? 그 부분부터 시작하는 것이 맞습니까? – harold

+1

코드가 정확합니다. 테스트가 잘못되었습니다. – erickson

+0

내 업데이트 된 게시물을 참조하십시오. 값이 32 비트 레지스터에 저장되는 방법과 결과가 어떻게 표시되는지 보여주는 이미지가 있습니다. 10111627 – Josef

답변

0

내가 대한 요약을 시도하고 희망 귀하의 질문에 여러 의견이 이미 나타내는 것을 명확히 : 당신이 당신의 이미지에서 숫자를 얻고 싶다면

하는
00001010 00001011 00010000 00011011 = 0x0A0B101B = 168497179
입니다 하나의 long 값이고 두 개의 정수가 있습니다.
0001000000011011 = 0x101B = 4123
0000101000001011 = 0x0A0B = 2571
코드는 올바른입니다. 그들이 0x0A0B & 0x101B0x009A4A8B = 10111627 사이에 이진 관계가 없다는 것을 쉽게 보여 나는 당신을 추천 할 것입니다

는 16 진수로 사용하세요.

BTW 이미지는 모순 : 진수는 숫자 0x0A0B101B 위에서 본 표현한다하지만 헥사 값은 소수가 이진 값을 지원하면서 0x0A0B101E합니다 (E 통지) 참조하십시오. 당신은 결과로 함께 연결된 진수를 얻을 것으로 예상하는 것

:

마지막으로, 나는 당신의 결함을 알아 냈다. 그러나 여기의 16 진법과는 달리 이 아니며은 십진법으로이 방식으로 작동합니다!

내가 자세히 설명해 드리겠습니다. 당신은 진수가 :
00001010 00001011 00010000 00011011
쉽게 블록에 의해 육각 블록에
0x0A 0x0B 0x10 0x1B
을 변환 할 수 있으며,보다 그냥 함께
0x0A0B101B

을 그들과 합류하지만 마법 그냥 단순화에만 적용 조인 16 진수 (16 진수가 프로그래머들에게 인기가있는 이유).

긴 버전은 위 블록 (오른쪽)의 'basis'으로 상위 블록/바이트 (왼쪽으로)를 곱해야합니다. 가장 오른쪽 블록은 항상 1을 곱합니다. 다음 블럭의베이스는 (첫 번째 블럭에 8 비트가 있기 때문에) 2 = 256 = 0x100입니다. 세 번째 블록의 기준은 (8+8 비트) 2 = 65536 = 0x10000입니다. 마지막 (가장 왼쪽)에 (8+8+8 비트) 2를 곱해야합니다. = 16777216 = 0x1000000.

처음 두 블록 예를 만들 수 있습니다 :

진수 :
0x10 || 0x1B
(0x10 * 0x100) + (0x1B* 0x1)
0x1000 + 0x1B = 0x101B

진수 :
16 || 27
(16 * 256) + (27 * 1)
4096 + 27 = 4123

당신은 그들이 모두 (소수점 6/3 문제에있는 E/B 문제를 통지) 이미지에서 볼 수 있지만 1627이없는 것처럼 . 따라서 이진수 또는 16 진수를 십진수로 변환하는 것은 중요한 작업입니다 (사람의 경우). 계산기를 사용하는 것이 가장 좋습니다.

관련 문제