어떤 도구는 선과 악에 사용될 수 있지만 , 일부 도구 는 자주 사용하지 않는 프로그래머를 놀라게하기 때문에 악합니다.
32 비트보다 짧은 정수로 작업 할 때 Java 악의 부호없는 오른쪽 시프트 연산자 (>>>) (놀랍게도 부적절한)를 고려합니다.
값이 -1 인 바이트 b가 있다고 가정하십시오.
byte b = -1; // binary: 1111 1111
부호없는 오른쪽 시프트 연산자는 0을 가장 왼쪽 비트로 이동합니다. 따라서 1을 얻기 위해 7만큼 이동한다고 가정합니다.
b >>>= 7; // binary: 0000 0001 ?
그러나 대신이 작업은 전혀 수행하지 않습니다. b는 여전히 -1입니다.
다음 25 가지 교대조 모두 아무 것도 수행하지 않습니다.
byte b = -1;
for (int i = 0; i < 25; ++i) {
b >>>= i;
System.out.println(b); // always outputs -1
}
이것은 b>>>=7
대략적으로
1111 1111
1) the byte gets widened to a 32 bit int to make shifting possible
1111 1111 1111 1111 1111 1111 1111 1111
2) the shift happens
0000 0001 1111 1111 1111 1111 1111 1111
3) the resulting int gets narrowed to a byte again
1111 1111
교체해야 할 것입니다
b >>>= i;
으로, ~에 의하여
b = (b & 0xFF) >>> (i % 8); // >> would also work this time
'예상대로'작동하도록합니다.