2017-12-18 14 views
1

16 비트 부호있는 정수를 상징하는 두 개의 Java 바이트를 입력으로 가져옵니다. 나는 하나의 자바 정수로 변환 할 필요가있다. 나는 "못생긴"해결책을 생각해 냈는데, 그 해결책은 int로 변환 한 다음 짧고 int로 변환하는 것을 포함한다. 더 짧고 우아한 방법이 있습니까? 내 코드는 다음과 같습니다 :이 바이너리 - 자바 유형 코드를 단순화하는 방법은 무엇입니까?

public int convert(byte b1, byte b2){ 
    int i1 = (int) (((b2 << 8) + (b1 & 0xFF)) & 0x0000FFFF); 
    short s1 = (short) i1; 
    int i2 = (int) s1; 
    return i2; 
} 
+0

'return (short) i1; '은 자동 확장을 사용하면 더 간단합니다. –

+0

그러나 나는 (짧은 이유가 아니라) 마지막으로 int를 얻어야한다. – alebo611

+0

'return (short) i1;'은 마지막 세 줄과 동일합니다. 손가락 걸고 약속. –

답변

1

이 컨버터를 일치 것 - 확실하지가 간단을하지만 확실히 덜 장황하다.

public int convert2(byte b1, byte b2) { 
    return new BigInteger(new byte[]{b2,b1}).intValue(); 
} 
+0

흥미로운 솔루션을 시도합니다. 성능이 중요하지 않다는 사실을 잊어 버렸습니다. 실시간으로이 숫자의 톤을 변환해야합니다. – alebo611

1

은 IS 다음 당량

byte b1 = Byte.MIN_VALUE; 
do { 
    byte b2 = Byte.MIN_VALUE; 
    do { 
    assertEquals(convert(b1, b2), convertEquivalent(b1, b2)); 
    } while (b2++ != Byte.MAX_VALUE); 
} while (b1++ != Byte.MAX_VALUE); 

Ideone demo :

return (short) ((b2 << 8) | (b1 & 0xFF)); 

byteb1b2 모든 가능한 값이 동등한 테스트 실용적인 것을 충분히 작은 범위를 갖는다

0

@AndTurner는 아마도 당신이 찾은 해결책 일 것입니다.

그러나 바이트 배열이나 일부 파일 채널 (메모리 매핑 된 파일), 입력 스트림이 관련된 경우 ByteBuffer를 사용할 수 있습니다.

byte[] bytes = ... 
ByteBuffer buf = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); 
... 
short n = buf.readShort(); // Sequential 
short m = buf.readShort(354L); // Direct access