너무 늦었지만 JB Nizet이 제공 한 솔루션이 작동하는 이유를 명확히 할 수 있으므로 이에 대한 의견을 제공하고 싶습니다. 나는 바이트 파서와 문자열 변환 작업 에서이 작은 문제를 발견했습니다. 이 자바 문서에 따르면 더 큰 크기의 정수 유형에서 더 작은 크기의 정수 유형으로 복사하면 다음과 같은 일이 발생합니다.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
부호있는 정수를 정수 유형 T로 축소 변환하면 가장 낮은 n 개를 제외하고 모두 버립니다. 순서 비트, 여기서 n은 유형 T를 나타내는 데 사용되는 비트 수입니다. 숫자 값의 크기에 대한 정보의 손실 가능성 외에도 결과 값의 부호가 입력 값의 부호와 다를 수 있습니다. .
이 자바 문서가 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
바이트 라고 말했듯이 바이트가 정수 유형인지 확인할 수 있습니다
. 바이트 데이터 유형은 8 비트 부호있는 2입니다. 보수 정수.
따라서 정수 (32 비트)를 바이트 (8 비트)로 캐스팅하는 경우 해당 정수의 마지막 (최하위 8 비트)을 주어진 바이트 변수에 복사합니다.
int a = 128;
byte b = (byte)a; // Last 8 bits gets copied
System.out.println(b); // -128
이야기의 두 번째 부분은 Java 단항 및 이항 연산자가 피연산자를 촉진하는 방법을 포함합니다.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
확장 기본 변환 (§5.1.2)이 적용되어 지정된대로 피연산자 중 하나 또는 둘 다를 변환합니다. 다음 규칙에 따라 :
피연산자가 double 유형이면 다른 피연산자가 double로 변환됩니다.
그렇지 않고 피연산자 중 하나가 float 유형이면 다른 피연산자가 float로 변환됩니다.
그렇지 않고 피연산자 중 하나가 long 유형이면 다른 피연산자가 long으로 변환됩니다.
그렇지 않으면 두 피연산자가 모두 int 유형으로 변환됩니다.
int 유형 및 / 또는 그 이하로 작업하는 경우 int로 승격되므로 안심하십시오.
// byte b(0x80) gets promoted to int (0xFF80) by the & operator and then
// 0xFF80 & 0xFF (0xFF translates to 0x00FF) bitwise operation yields
// 0x0080
a = b & 0xFF;
System.out.println(a); // 128
나는 이것에도 내 머리를 긁었다 :). 여기에 rgettman의 좋은 대답이 있습니다.
정수 및 long에 대해서만 Java의 비트 연산자?