[java] >>>와 >>의 차이점

Java에서 >>>>>연산자 의 차이점은 무엇입니까 ?



답변

>>산술 시프트 오른쪽, >>>논리 시프트 오른쪽입니다.

산술 시프트에서 부호 비트는 숫자의 부호를 유지하도록 확장됩니다.

예를 들어, 8 비트로 표현 된 -2는 11111110(가장 중요한 비트는 음의 가중치를 가지므로)입니다. 산술 시프트를 사용하여 오른쪽으로 1 비트 이동하면 11111111-1이됩니다. 그러나 논리적 인 오른쪽 이동은 값이 부호있는 숫자를 나타낼 수 있다는 것을 신경 쓰지 않습니다. 단순히 모든 것을 오른쪽으로 옮기고 왼쪽에서 0으로 채 웁니다. 논리 시프트를 사용하여 -2를 1 비트 오른쪽으로 시프트하면 다음과 같이 01111111됩니다.


답변

>>>부호없는 시프트입니다. 0을 삽입 >>하고 부호 비트를 확장합니다.

JLS 15.19 시프트 연산자

시프트 연산자에는 왼쪽 시프트 <<, 부호있는 오른쪽 시프트 >>및 부호없는 오른쪽 시프트가 >>>있습니다.

의 값은 부호 확장n>>s 이있는 n오른쪽으로 이동 된 s비트 위치입니다 .

의 값 n>>>s이고 n오른쪽 시프트 s와 비트 위치 제로 확장 .

    System.out.println(Integer.toBinaryString(-1));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >> 16));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >>> 16));
    // prints "1111111111111111"

긍정적 인 대응 물을 더 명확하게하기 위해

System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"

양수이기 때문에 부호있는 시프트와 부호없는 시프트는 0을 가장 왼쪽 비트에 추가합니다.

관련 질문


답변

그들은 둘 다 오른쪽 시프트하지만 >>>입니다unsigned

로부터 문서 :

부호없는 오른쪽 시프트 연산자 “>>>”는 0을 가장 왼쪽 위치로 이동하고 “>>”뒤의 가장 왼쪽 위치는 부호 확장에 따라 다릅니다.


답변

논리 오른쪽 시프트 ( v >>> n)는 비트 위치에서 비트 v가 오른쪽으로 시프트 n되고 0이 왼쪽에서 시프트 된 값을 반환합니다 . 이진수로 작성된 8 비트 값의 이동을 고려하십시오.

01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000

비트를 부호없는 음이 아닌 정수로 해석하면 논리 오른쪽 이동은 숫자를 해당하는 2의 거듭 제곱으로 나누는 효과가 있습니다. 그러나 숫자가 2의 보수 표현 인 경우 논리 오른쪽 이동은 음수를 올바르게 나누지 않습니다. . 예를 들어, 비트가 부호없는 숫자로 해석 될 때 위의 두 번째 오른쪽 이동은 128에서 32로 이동합니다. 그러나 Java에서 일반적인 것처럼 비트가 2의 보수로 해석되면 -128에서 32로 이동합니다.

따라서 2의 거듭 제곱으로 나누기 위해 이동하는 경우 산술 오른쪽 이동 ( v >> n)이 필요합니다. 비트 위치에서 비트 v가 오른쪽으로 이동 한 값을 반환하고 v의 가장 왼쪽 비트의n 사본이 왼쪽 에서 이동 된 값을 반환합니다 .

01111111 >> 2 = 00011111
10000000 >> 2 = 11100000

비트가 2의 보수 표현의 숫자 인 경우, 산술 오른쪽 시프트는 2의 거듭 제곱으로 나눠지는 효과가 있습니다. 가장 왼쪽 비트가 부호 비트이기 때문에 작동합니다. 2의 거듭 제곱으로 나누면 부호가 동일하게 유지되어야합니다.


답변

>>>는 가장 왼쪽 비트에 항상 0을 >>넣고 부호의 부호에 따라 1 또는 0을 넣습니다.


답변

비트 단위 및 비트 시프트 연산자 에 대해 자세히 알아보십시오

>>      Signed right shift
>>>     Unsigned right shift

비트 패턴은 왼쪽 피연산자에 의해 제공되며 오른쪽 피연산자에 의해 이동할 위치 수입니다. 부호 오른쪽 시프트 연산자 >>> 이동 제로 가장 좌측에 위치를 ,

가장 왼쪽 위치 >>는 부호 확장에 따라 다릅니다.

간단히 말해서 >>>항상 0 을 가장 왼쪽 위치로 이동시키는 반면 >>숫자의 부호를 기준으로 이동합니다. 즉 음수의 경우 1, 양수의 경우 0입니다.


예를 들어 양수뿐만 아니라 음수도 사용하십시오.

int c = -153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.println(Integer.toBinaryString(c <<= 2));

System.out.println();

c = 153;
System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2));
System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2));

산출:

11111111111111111111111111011001
11111111111111111111111101100100
  111111111111111111111111011001
11111111111111111111111101100100

                          100110
                        10011000
                          100110
                        10011000


답변

오른쪽 시프트 논리 연산자 ( >>> N)는 비트를 N 위치 만큼 오른쪽으로 시프트 하여 부호 비트를 버리고 N 가장 왼쪽 비트를 0으로 채 웁니다. 예를 들면 다음과 같습니다.

-1 (in 32-bit): 11111111111111111111111111111111

>>> 1작업이 된 후 :

2147483647: 01111111111111111111111111111111

오른쪽 시프트 산술 연산자 ( >> N)는 비트를 N 위치만큼 오른쪽으로 시프트하지만 부호 비트는 유지하고 N 가장 왼쪽 비트는 1로 채 웁니다. 예를 들면 다음과 같습니다.

-2 (in 32-bit): 11111111111111111111111111111110

>> 1작업이 된 후 :

-1: 11111111111111111111111111111111