Java에서 비트와 비트, 포괄적 또는 질문
-
05-09-2019 - |
문제
프로젝트 내에서 몇 줄의 코드가 있습니다.
buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80);
파일에서 파일 버퍼를 읽고 바이트로 저장 한 다음 표시된대로 [I]로 전송하지만 전체 목적이 무엇인지 이해할 수 없습니까?
감사
해결책
다른 답변이 이미 언급했듯이 (currentByte & 0x7F) | (currentByte & 0x80)
동일합니다 (currentByte & 0xFF)
. JLS3 15.22.1 이것이 홍보된다고 말합니다 int
:
운영자의 두 피연산자가 &, ^, 또는 | 전환 가능한 유형 (§5.1.8)은 원시 적분 유형으로, 이진 숫자 홍보는 첫 번째 피연산자에서 수행됩니다 (§5.6.2). 비트 타이어 운영자 표현식의 유형은 홍보 된 피연산자 유형입니다.
JLS3 5.6.2 언제 currentByte
유형이 있습니다 byte
그리고 0x7F
이다 int
(그리고 이것은 사실입니다), 두 피연산자 모두 홍보됩니다. int
.
그러므로, buffer
요소 유형의 배열이됩니다 int
또는 더 넓습니다.
이제 공연을 통해 & 0xFF
에 int
, 우리는 원본을 효과적으로 매핑합니다 byte
범위 -128..127 부호없는 범위 0..255, 자주 사용하는 작업입니다. java.io
예를 들어 스트림.
다음 코드 스 니펫에서이를 볼 수 있습니다. 여기서 무슨 일이 일어나고 있는지 이해하려면 Java가 적분 유형을 저장한다는 것을 알아야합니다. char
, 처럼 2의 보완 가치.
byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));
마지막으로, 실제 예를 보려면 Javadoc 및 구현을 확인하십시오. read
의 방법 java.io.ByteArrayInputStream
:
/**
* Reads the next byte of data from this input stream. The value
* byte is returned as an <code>int</code> in the range
* <code>0</code> to <code>255</code>. If no byte is available
* because the end of the stream has been reached, the value
* <code>-1</code> is returned.
*/
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
다른 팁
(currentByte & 0x7F) | (currentByte & 0x80)
동일합니다
currentByte & (0x7F | 0x80)
그것은 동일합니다
currentByte & 0xFF
정확히 동일합니다
currentByte
편집 : 나는 과제의 오른쪽을 보았지만 여전히 동등성이 사실이라고 생각합니다.
그러나 코드가 서명되지 않은 것으로 해석하면서 서명 된 바이트를 더 큰 유형으로 캐스팅하려는 것 같습니다.
Java에 서명되지 않은 서명을 캐스트하는 더 쉬운 방법이 있습니까?
누군가가 여기서 너무 많은 생각을했다고 생각합니다. 그것은 옳지 않습니다.
나는 하나의 말만 가지고있다
- 오리지널 저자는 바이트를 기본 서명 정수 (아마도 32 비트)로 대체하는 것에 대해 걱정했으며 표지판 비트가 "특별한"것에 대해 명시 적으로 말하려고 노력하고 있습니까?
남은 코드입니다. 당신이 비린내 런 타임에 있다는 것을 알고 있지 않다면? 어쨌든 '버퍼'의 유형은 무엇입니까?
복잡한 비트로 논리는 완전히 불필요합니다.
for (int i = 0; i < buffer.length; i++) {
buffer[i] = filebuffer[currentPosition + i] & 0xff;
}
같은 일을합니다. 버퍼가 바이트 배열로 선언되면 & 0xff를 제거 할 수도 있지만 불행히도 선언은 표시되지 않습니다.
그 이유는 원래 개발자가 Java로 서명 된 바이트가 혼란 스러웠 기 때문일 수 있습니다.
비트와 작동의 결과는 두 비트가 모두 1 인 반면, 비트 또는 작동의 결과는 봇 비트 중 하나가 1 인 비트를 사용합니다.
따라서 값 0x65에 대한 예제 평가 :
01100101 0x65
& 01111111 0x7F
===============
01100101 0x65
01100101 0x65
& 10000000 0x80
===============
00000000 0x00
01100101 0x65
| 00000000 0x00
===============
01100101 0x65
이러한 종류의 논리적 작업에 대한 좋은 점 : 가능한 모든 조합 (256 개)을 시도하고 예상 한 답변을 얻는 것을 확인할 수 있습니다.
바이트가 읽은 파일은 서명 된 비트 표기법으로, 길이가 다른 파일이므로 올바른 부호를 유지하면서 Java Int 유형으로 확장 할 수 있도록이 작업을 수행하도록 요청했습니다. :)