시프트 연산자 예제

비트 시프트 연산자는 두 개의 피연산자(첫 번째 피연산자)를 취하고, 두 번째 는 첫 번째 피연산자가 이동될 비트 위치 수를 지정합니다. 시프트 작업의 방향은 사용되는 작업자에 의해 제어됩니다. 시프트 연산자는 해당 카페랜드를 32비트 또는 64비트로 변환하고 왼쪽 연산자와 동일한 유형의 결과를 반환합니다. 이 것들은 원형 교대가 아닙니다. 이 값을 한 위치로 왼쪽으로 이동 (3,758,096,384 << 1): 이제 고가의 곱셈 작업 대신 두 비트 시프트를 사용합니다. x86에서는 다음과 같이 될 것입니다 (참고, 내가 어셈블리를 완료 한 이후 영원히되었습니다 (편집자의 참고 : 몇 가지 실수를 수정하고 32 비트 예제를 추가): 다음 설명과 예제는 x86 및 x64 아키텍처에 대한 Windows에서 유효합니다. 좌근 및 우측 시프트 연산자의 구현은 ARM 장치용 Windows에서 크게 다릅니다. 자세한 내용은 Hello ARM 블로그 게시물의 "시프트 연산자" 섹션을 참조하십시오. 개념적으로 비트 방향 논리 연산자는 다음과 같이 작동합니다. 비트를 왼쪽으로 이동하는 대신 오른쪽으로 이동하기만 하면 됩니다. 예를 들어 숫자 12: 이 비트 패턴을 왼쪽 한 위치로 이동하면(6 <>) 오른쪽 시프트에 의해 노출된 가장 왼쪽 비트는 왼쪽 비트의 이전 내용으로 채워지습니다. 그러나 서명되지 않은 오른쪽 시프트 연산자는 항상 0을 채우고 0은 양수와 음수에 관계없이 0만 채웁니다.

예를 들어 논리 적 이동은 서명되지 않은 정수의 곱셈을 수행하거나 두 개의 힘으로 나누는 효율적인 방법으로 유용할 수 있습니다. 서명된 이진 번호또는 서명되지 않은 이진 번호에서 n비트로 왼쪽으로 이동하면 2n을 곱하는 효과가 있습니다. 서명되지 않은 이진 번호에서 n 비트로 오른쪽으로 이동하면 2n으로 나누는 효과가 있습니다(0으로 반올림). 각 연산자는 첫 번째 오연자의 비트를 두 번째 오퍼랜드로 표시된 위치 수에 따라 이동합니다. 시프트는 연산자 자체가 지시한 방향으로 발생합니다. 예를 들어 다음 문은 정수 13의 비트를 한 위치로 오른쪽으로 이동합니다. 아니, a의 반전된 값(일명 보수)을 산출합니다. NOT 연산에 대한 진실 테이블은 비트 방향 논리 연산자가 종종 이진 변수와 같은 플래그 시퀀스를 만들고 조작하고 읽는 데 사용됩니다. 변수는 이러한 시퀀스 대신 사용할 수 있지만 이진 플래그는 메모리가 훨씬 적습니다(32배).

예를 들어 이 픽셀 색상의 녹색 값을 얻으려고 한다고 가정해 보겠습니다. 마스킹과 시프팅을 통해 그 가치를 쉽게 얻을 수 있습니다. 또 다른 예인 12<-3을 살펴보겠습니다. -3 이진 표현은 11111101입니다. 그런 다음 op2 = 0xfd 및 0x1f = 0x1d = 29. (12<-3)의 결과는 (12<<-3)와 동일한 결과를 가짐입니다.<<29.

언어는 산술 및 논리적 권리 이동을 여러 가지 방법으로 처리합니다. Java는 두 개의 오른쪽 시프트 연산자(“>”)를 제공합니다. 일관된 반올림이 필요한 응용 프로그램에서는 서명된 값에 대한 산술 오른쪽 시프트가 유용합니다. 예를 들어 래스터 좌표를 2의 힘으로 축소하는 데 있어 간격을 유지합니다. 예를 들어, 1에 의한 오른쪽 시프트는 0, 1, 2, 3, 4, 5, … 에 0, 0, 1, 1, 2, 2, …, 및 -1, -2, -3, -4, …

-1, -1, -2, -2, …, -2, -2, -1, -1, 0, 0, 1, 1, 2, 2, …로 도 간격을 유지 … 대조적으로, 0으로 반올림정수분은 -1, 0, 1 모두 0(2대신 3점)을 전송하여 -2, -1, -1, -1, 0, 0, 0, 1, 2, 2, … 대신 0에서 불규칙합니다. 그러나 산술 우측 시프트는 특히 음수 정수의 반올림을 처리하는 부주의의 주요 함정입니다. 예를 들어, 보통 두 개의 네거티브 정수의 보체 표현에서 -1은 모두 1로 표시됩니다.