2017-01-29 4 views
0

에 비트 OR 부호 확장하지 않고 수행 : 첫 번째 수술 후가 나는 다음과 같은 코드가 자바에서 자바

byte lo = 0x88; 
    byte hi = 0x0; 
    short x = 0; 
    x |= lo; 
    x |= (short) ((short) hi << 8); // FIXME double cast ?? 
    return x; 

을, 짧은에있는 값은 0xff88입니다. Java가 서명되지 않은 숫자를 지원하지 않기 때문에 이것이 이해됩니다.

어떻게하면 신호를 무시할 수 있습니까? Java 코드에서이 데이터를 직접 사용하지 않으므로 중요하지 않습니다.

+2

'byte lo = 0x88;'는 컴파일되지 않고 그 값은 'byte'로 표현 된 숫자의 범위를 벗어납니다. – manouti

+0

@ AR.3 서명을 피하는 방법을 알고 싶습니다. –

+1

현재 코드가 컴파일되지 않습니다. 완전한 예제를 제공 할 수 있습니까? – Bubletan

답변

1

바이트가 비트 연산을 수행하기 전에 int로 변환되면 부호가 나타납니다. byte은 Java의 부호 유형이므로 변환은 byte 값을 확장해야합니다. 비트 단위 연산은 int 값 또는 long 값의 연산이므로 변환이 발생해야합니다.

두 용액 있습니다

  1. 가 어느 쪽 int로 변환 한 후, 또는 OR 연산을 수행 한 후, 상위 비트 마스크; 예 :

    x |= (lo & 0xff); 
    x |= (hi & 0xff) << 8; 
    

    은 (그것은 마스킹 때문에 나중에 무슨의 ... hi 불필요한 것으로 밝혀졌습니다.하지만, 기회는 JIT 컴파일러는 불필요한 마스킹 지침을 멀리 최적화 할 수 있습니다. 그리고 '그것 아무튼 경우 것입니다 t는 오버 헤드는 중요 할 가능성이 너무 작습니다.)

  2. 사용 Byte.toUnsignedInt(byte)intbyte을 변환 할 수 있습니다.

+0

도움이되는 답변에 감사드립니다. 이것은 문제를 해결했습니다. –