programing

Java에서 시프트 연산자는 어떻게 작동합니까?

goodsources 2022. 8. 29. 22:25
반응형

Java에서 시프트 연산자는 어떻게 작동합니까?

저는 시프트 오퍼레이터를 이해하려고 노력하고 있으며, 많은 것을 얻을 수 없었습니다.아래 코드를 실행하려고 했을 때

System.out.println(Integer.toBinaryString(2 << 11));
System.out.println(Integer.toBinaryString(2 << 22));
System.out.println(Integer.toBinaryString(2 << 33));
System.out.println(Integer.toBinaryString(2 << 44));
System.out.println(Integer.toBinaryString(2 << 55));

이하를 알 수 있습니다.

1000000000000    
100000000000000000000000    
100    
10000000000000    
1000000000000000000000000    

누가 설명 좀 해주시겠어요?

System.out.println(Integer.toBinaryString(2 << 11)); 

2 (2진수)를.1011시 정각시 : 이때에 hence,1000000000000

System.out.println(Integer.toBinaryString(2 << 22)); 

2 (2진수)를.1022살이에요. : 그문 、100000000000000000000000

System.out.println(Integer.toBinaryString(2 << 33)); 

인트 4번, 32번따라서 33만큼 이동하면 1만큼 이동되는 것과 같습니다. : 그문 、100

2진법에서의 10진법 번호 체계로부터의 2는 다음과 같다.

10

그렇다면

2 << 11

오른쪽에는 11개의 0이 패딩되어 있습니다.

1000000000000

서명된 왼쪽 시프트 연산자 "<"는 비트 패턴을 왼쪽으로 이동하고 서명된 오른쪽 시프트 연산자 ">"는 비트 패턴을 오른쪽으로 이동합니다.비트 패턴은 왼쪽 피연산자에 의해 지정되며, 오른쪽 피연산자에 의해 이동되는 위치 수는 오른쪽 피연산자에 의해 지정됩니다.부호 없는 오른쪽 시프트 연산자 ">>"는 0을 맨 왼쪽 위치로 이동하고 ">" 뒤의 왼쪽 위치는 기호 확장자 [..]에 의존합니다.

왼쪽 이동 결과에서 2(*2)의 곱셈(항 또는 산술)이 발생합니다.


예를들면

2의 2분의 110 '어울리다'라고 해요<<1,이 .100, 「」입니다.4

4의 4100 '어울리다'라고 해요<<1,이 .1000, 「」입니다.8


기타 항목

오른쪽 시프트와 왼쪽 시프트가 같은 방법으로 동작하는 방법에 대해 설명합니다.올바른 전환:오른쪽 시프트 연산자 >>는 값의 모든 비트를 지정된 횟수만큼 오른쪽으로 이동합니다.일반적인 형태:

value >> num

여기서 num은 값에서 값을 오른쪽 이동할 위치 수를 지정합니다.즉, >>는 지정된 값의 모든 비트를 num으로 지정된 비트 위치 수의 오른쪽으로 이동합니다.다음 코드 프래그먼트는 값 32를 오른쪽으로 2개씩 이동시켜 a를 8로 설정합니다.

int a = 32;
a = a >> 2; // a now contains 8

값에 "shift off" 비트가 있으면 해당 비트는 손실됩니다.예를 들면, 다음의 코드 프래그먼트는, 값 35를 오른쪽의 2개의 위치로 이동시켜, 2개의 하위 비트를 소실시켜, 다시 a를 8로 설정한다.

int a = 35;
a = a >> 2; // a still contains 8

같은 연산을 바이너리로 보면, 이러한 현상이 어떻게 발생하는지를 보다 명확하게 알 수 있습니다.

00100011 35 >> 2
00001000 8

값을 오른쪽으로 이동할 때마다 해당 값이 2로 분할되고 나머지 값은 삭제됩니다.고성능 정수를 2로 나누면 이 점을 활용할 수 있습니다.물론 올바른 방향으로 비트를 옮기지 않도록 해야 합니다.오른쪽으로 이동하면 오른쪽 이동에 의해 노출된 상단(맨 왼쪽) 비트가 상단 비트의 이전 내용으로 채워집니다.이것은 부호 확장이라고 불리며 음수 기호를 오른쪽으로 이동할 때 이를 보존하는 역할을 합니다.를 들어, 「」라고 하는 것은,–8 >> 1–42진수입니다

11111000 –8 >>1
11111100 –4

흥미로운 점은 부호 확장이 상위 비트에 계속 추가되기 때문에 -1을 오른쪽으로 이동하면 결과는 항상 -1로 유지된다는 것입니다.값을 오른쪽으로 이동할 때 확장 부호를 사용하는 것이 바람직하지 않을 수 있습니다.예를 들어, 다음 프로그램은 바이트 값을 16진수 문자열로 변환합니다.시프트 값은 0x0f로 AND 처리하여 마스킹되고 부호 확장 비트는 폐기되므로 값이 16진수 문자 배열의 인덱스로 사용할 수 있습니다.

// Masking sign extension.
class HexByte {
  static public void main(String args[]) {
    char hex[] = {
      '0', '1', '2', '3', '4', '5', '6', '7',
      '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
    };
  byte b = (byte) 0xf1;
 System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}

이 프로그램의 출력은 다음과 같습니다.

b = 0xf1

도움이 될 것 같습니다.

    System.out.println(Integer.toBinaryString(2 << 0));
    System.out.println(Integer.toBinaryString(2 << 1));
    System.out.println(Integer.toBinaryString(2 << 2));
    System.out.println(Integer.toBinaryString(2 << 3));
    System.out.println(Integer.toBinaryString(2 << 4));
    System.out.println(Integer.toBinaryString(2 << 5));

결과

    10
    100
    1000
    10000
    100000
    1000000

편집 완료:

이 정보를 꼭 읽어야 합니다(비트 단위 이동 연산자 작업 방법)

예를 들어 다음과 같습니다.

  • 서명된 좌측 시프트

[ 2 < 1 ]는 => [10(2의 제곱)은 이진 문자열 끝에 1의 0을 더합니다]따라서 10은 100이 되고 4가 됩니다.

부호 있는 왼쪽 시프트는 곱셈을 사용합니다...따라서 이 값은 2 * (2^1) = 4. 다른 예 [2 < 11] = 2 * (2^11) = 4096으로 계산할 수 있습니다.

  • 서명된 우측 시프트

[ 4 > > 1 ]는 => [100(4의 제곱) 바이너리 문자열 끝에 있는1개의 0을 삭제합니다]따라서 100은 10이 되고 2가 됩니다.

서명된 오른쪽 시프트는 나눗셈을 사용합니다...따라서 이 값은 4 / (2^1) = 2 다른 예 [4096 >> 11] = 4096 / (2^11) = 2로 계산할 수도 있습니다.

수의 시킵니다.0's.

ex의 경우

  • 10가 'Digit'입니까?2는 '2'입니다.1000가 'Digit'입니까?8
  • 10가 'Digit'입니까?2은 '3'이다.10000어느 것이 숫자입니까?16

시프트는 데이터 유형(char, int 및 long int)을 사용하여 구현할 수 있습니다.부동 및 이중 데이터는 이동되지 않습니다.

value= value >> steps  // Right shift, signed data.
value= value << steps  // Left shift, signed data.

서명된 왼쪽 시프트 논리적으로 심플한 경우 1 < 11 이면 2048 및 2 이 됩니다.< 11 이면 4096 이 됩니다.

자바 프로그래밍에서 a = 2 < 11;

// it will result in 4096

2<<11 = 2*(2^11) = 4096

변수를 이동하고 변수에 다시 할당하는 일반적인 방법은 속기 연산자 <<=, >= 또는 >=로 고쳐 쓸 수 있습니다.이러한 연산자는 사양에서는 복합 할당 연산자로도 알려져 있습니다.

예를들면,

i >>= 2

과 같은 결과를 낳다

i = i >> 2

언급URL : https://stackoverflow.com/questions/10910913/how-do-shift-operators-work-in-java

반응형