모든 Java 바이트가 서명된다는 사실을 해결하는 가장 좋은 방법은 무엇입니까?
Java에는 부호없는 바이트와 같은 것이 없습니다.
일부 저수준 코드로 작업 할 때 부호없는 값이 128보다 큰 바이트로 작업해야하는 경우가 있습니다. 이로 인해 Java는 부호에 MSB가 사용되기 때문에이를 음수로 해석합니다.
이 문제를 해결하는 좋은 방법은 무엇입니까? (Java를 사용하지 않는다고 말하는 것은 옵션이 아닙니다)
배열에서 단일 값을 읽을 때 short 또는 int와 같은 것으로 복사하고 수동으로 음수를 양수 값으로 변환하십시오.
byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
배열에 쓸 때 유사한 변환을 수행 할 수 있습니다.
실제로 이렇게하면 if 문과 추가를 제거 할 수 있습니다.
byte[] foobar = ..;
int value = (foobar[10] & 0xff);
이런 식으로 Java는 바이트를 음수로 해석하지 않고 정수의 부호 비트도 뒤집습니다.
int를 사용하는 것이 일반적으로 short를 사용하는 것보다 낫습니다. Java는 어쨌든 내부적으로 32 비트 값을 사용하기 때문입니다 (배열에 있지 않은 경우에도 바이트에 대해서도). 따라서 int를 사용하면 바이트 코드에서 짧은 값과의 불필요한 변환을 피할 수 있습니다.
아마도 가장 좋은 방법은 바이트가 아닌 정수를 사용하는 것입니다. 바이트를 대체하기 위해 특별한 객체를 생성해야하는 오버 헤드없이 128보다 큰 숫자를 허용 할 수있는 공간이 있습니다.
이것은 나보다 똑똑한 사람들도 제안합니다 (모두)
- http://www.darksleep.com/player/JavaAndUnsignedTypes.html
- http://www.jguru.com/faq/view.jsp?EID=13647
비트 조작 / 부호없는 바이트를 수행하는 가장 좋은 방법은 int 를 사용하는 것 입니다. 서명되었지만 서명되지 않은 바이트로 처리 할 여분의 비트 (총 32 개)가 많이 있습니다. 또한 모든 수학 연산자는 더 작은 고정 정밀도 숫자를 int 로 변환 합니다. 예:
short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short
이 때문에 관심있는 비트를 얻기 위해 정수를 고수하고 마스크하는 것이 가장 좋습니다. 예 :
int a = 32;
int b = 128;
int foo = (a + b) | 255;
다음은 Java 기본 유형에 대한 추가 정보입니다. http://mindprod.com/jgloss/primitive.html
마지막 사소한 메모 하나, Java에는 부호없는 고정 정밀도 숫자가 하나 있습니다. 이것이 char 프리미티브입니다.
나는 이것이 매우 늦은 응답이라는 것을 알고 있지만 똑같은 일을하려고 할 때이 스레드를 발견했습니다. 문제는 단순히 Java 바이트가> 127인지 확인하려는 것입니다.
간단한 해결책은 다음과 같습니다.
if((val & (byte)0x80) != 0) { ... }
실제 문제가 128보다 큰 경우 해당 if 문에 다른 조건을 추가하면 트릭이됩니다.
나는 당신이 그들을 저장하기 위해 짧은 것을 사용할 수 있다고 생각합니다. 그다지 효율적이지는 않지만 내가 본 엄청난 노력 외에는 실제로 유일한 옵션입니다.
'program story' 카테고리의 다른 글
사용중인 Play 버전을 확인하는 방법은 무엇입니까? (0) | 2020.12.12 |
---|---|
뷰 사이의 가변 간격으로 UIStackView를 어떻게 만들 수 있습니까? (0) | 2020.12.12 |
여러 SVN 저장소를 하나로 결합 (0) | 2020.12.12 |
순수한 C로 RAII를 구현합니까? (0) | 2020.12.12 |
GROUP BY 및 COUNT (DISTINCT)를 사용하는 LINQ to SQL (0) | 2020.12.12 |