2009-12-29 1 views
5

이동 된 숫자가 양수인 경우 >>> 및 >> 같은 식으로 작동합니다.>>> 연산자와 >>> 연산자의 차이점

시프트 수가 >>> 음수 0

내 이해 맞와 최상위 충전 동작 >> 시프트 1S 반면에 최상위 비트를 채우면?

MSB를 1로 설정하고 Java가 사용하는 2의 보수 방법이 아닌 음수가 저장된 경우 연산자가 완전히 다르게 동작할까요? 것들로 채워 >> 동안 HO 비트 1

+0

가능한 중복 : [>>>와 >>]의 차이점 (http://stackoverflow.com)/q/2811319/1529630), [Java >> >> >>> 연산자?] (http://stackoverflow.com/q/1034640/1529630) – Oriol

답변

8

음수가 표시되는 방식을 2의 보수라고합니다. 이것이 어떻게 작동하는지 보여주기 위해, -12를 예로 들자. 12는 2 진수로 00001100입니다 (실제로는 훨씬 더 큽니다. 정수는 8 비트라고 가정). 모든 비트를 반전하여 2의 보수를 취하면 11110011이됩니다. 그런 다음 1을 더하면 11110100이됩니다. 같은 단계를 다시 적용하면 양수로 돌아옵니다.

>>> 무엇이든 상관없이 >>>가 바뀌므로 12 >>> 1은 00000110을 6으로, (-12) >>> 1은 01111010을 122로 제공해야합니다. 실제로 Java에서 이것을 시도하면 Java int가 실제로 8 비트보다 훨씬 크기 때문에 훨씬 큰 수를 얻을 수 있습니다.

>> 가장 높은 비트와 동일한 비트가 이동하므로 양수는 양수로 유지되고 음수는 음수로 유지됩니다. 12 >> 1은 00000110 (여전히 6)이고 (-12) >> 1은 11111010이고 음수는 6입니다.

1

정반대은 >>> 제로로 채워 :

n>>>s의 값은 N의 오른쪽 시프트 인 확장자가 0 인 비트 위치. n이 양수이면 결과는 n>>s과 동일합니다. n이 음수이면 왼쪽 피연산자의 유형이 int 인 경우 결과는 (n>>s)+(2<<~s)이고, 왼쪽 피연산자의 유형이 long 인 경우 결과는 (n>>s)+(2L<<~s입니다.

+0

왜'7 >>> 32 = 7'인지 설명 할 수 있습니까? 순환 교대 (circular shift)에 대해서 들었지만,''''에만 적용된다고 생각했습니다. 32 이동이 0 일 때 '7 >>> 32'가되지 않습니까? –

+0

@IanLimarta : 왼쪽면이 int이면 시프트 양은 mod 32로 줄어 듭니다. 귀하의 경우, 시프트 양은 0이며 이는 사실상 아무런 작동도하지 않음을 의미합니다. [JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19)를 참조하십시오. –