2011-11-20 12 views
2

16 진수 문자열로 인쇄 할 때 10 진수를 나타내는 byte [5] 배열이 있습니다. 두 자리 숫자는 한 바이트에 저장 될 수 있으며, 16 진수 문자는 사용되지 않습니다. 예. 숫자의 16 진수 표현을 10 진수 값으로 변환하는 방법

[0x11,0x45,0x34,0x31,0x21] -> 1145343121. 

도 재미있을 것

long result = Long.parseLong(byteToHexString(bytes[]));? 

이외의 소수에 효율적인 변환 그 반대의 변환을 수행하는 자바보다 효율적인 방법 (어쩌면 일부 bitshifting 마법)이 있습니다 ...

+1

당신에게 ' 메모리 사용량이 거의 없어도 많은 CPU주기를 희생해야합니다. – awm

+0

+1에 대한 니블 :) –

+0

사실, 이렇게하는 것은 내 선택이 아닙니다 ...;) – user462982

답변

2

여기 가면 속임수는 한 번에 nibble입니다.

byte[] buf = { 0x11, 0x45, 0x34, 0x31, 0x21 }; 
    long result = 0; 
    for (int i = 0; i < buf.length; i++) { 
     result = result * 100 + (buf[i] >> 4 & 0XF) * 10 + (buf[i] & 0XF); 
    } 
    System.out.println(result); 

출력

1145343121 
+0

그래, 고마워, 잘 작동하고 짧고 달콤 해 보인다. 작은 테스트를 했습니까 : 사소한 방법보다 6 배의 성능을 능가합니다. – user462982

3
((a[0]>>>4)*1000000000L + (a[0]&15)*100000000L + 
(a[1]>>>4)* 10000000L + (a[1]&15)* 1000000L + 
(a[2]>>>4)* 100000L + (a[2]&15)* 10000L + 
(a[3]>>>4)*  1000L + (a[3]&15)*  100L + 
(a[4]>>>4)*  10L + (a[4]&15)) 
+0

@ x4u : 편집 해 주셔서 감사합니다. 너는 나를 때렸다. –

+0

죄송합니다. 올바르게 작동하지 않습니다. 그 결과를 긴 변수에 할당합니다. 잘못된? – user462982

1

크 누스 후, 컴퓨터 프로그래밍의 예술, 2 개 Seminumerical 알고리즘, 대답은 4.4 (19) 운동하기 :

public long binaryValue(long bcd) 
{ 
    long x = bcd; 
    x -= ((x & 0xf0f0f0f0f0f0f0f0L) >> 4)*(0x10-10); 
    x -= ((x & 0xff00ff00ff00ff00L) >> 8)*(0x100-100); 
    x -= ((x & 0xffff0000ffff0000L) >> 16)*(0x10000-10000); 
    x -= ((x & 0xffffffff00000000L) >> 32)*(0x100000000L-100000000); 
    return x; 
} 
관련 문제