C의 시프트 연산자 유형
이 기사에서는 변수 값의 비트에서 수행되는 비트 연산자 유형인 시프트 연산자를 이해할 것입니다. 시프트 연산자에는 왼쪽 시프트 연산자와 오른쪽 시프트 연산자의 두 가지 유형이 있습니다.
이러한 연산자를 살펴보겠습니다.
C의 시프트 연산자
왼쪽 시프트 연산자는 <<
기호로 표시되고 오른쪽 시프트 연산자는 >>
기호로 표시됩니다. 이러한 연산자는 이진 연산자이며 연산자 양쪽에 두 개의 피연산자가 필요하며 둘 다 정수여야 합니다.
오른쪽 시프트 산술 연산자의 구문은 다음과 같습니다.
n >> m ;
n
의 값을 m
비트만큼 오른쪽으로 이동합니다. 여기서 n
과 m
은 정수입니다.
C의 시프트 연산자 유형
C에는 오른쪽 시프트 연산자 >>
가 하나만 있습니다. C 컴파일러는 시프트되는 정수 유형에 따라 사용할 오른쪽 시프트를 선택합니다.
산술 시프트는 부호 있는 정수를 이동할 때 사용하고 부호 없는 정수를 논리 시프트를 사용하여 이동할 때 사용합니다.
두 경우 모두 부호 없는 왼쪽 또는 오른쪽 시프트에 대해 논리적 시프트가 발생하지만 부호 있는 정수 값의 경우에는 논리적 시프트를 사용할 수 없습니다. 논리 시프트는 부호를 변경할 수 있으므로 산술 시프트를 사용하여 이 문제를 제거할 수 있습니다.
따라서 오른쪽 산술 시프트에서는 MSB(부호 비트)가 복사되어 오른쪽으로 시프트됩니다. 효과는 2로 나누는 것입니다.
부호 있는 숫자의 구문:
n1=-n2;
n1>>m1;
부호 있는 정수의 경우 첫 번째 비트를 빈 슬롯에 저장하고 이동하는 동안 다음 비트로 복사본을 이동합니다.
산술 및 논리적 왼쪽 이동은 동일합니다. 음수 값의 경우 오른쪽 이동만 다릅니다.
따라서 부호 있는 값을 오른쪽으로 이동하는 프로그램은 본질적으로 이식성이 없습니다.
값을 오른쪽으로 n
비트 이동하면 값을 n
까지 2만큼 나누고 값을 왼쪽으로 n
비트 이동하면 값에 n
승으로 2를 곱합니다. .
예제 코드:
#include <stdio.h>
int main(void) {
int dd = -15;
int ee = 15;
printf("value of dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
printf("value of dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
printf("value of dd right shift(sign bit) by 3 bits, is %d\n", dd >> 3);
printf("value of dd right shift by 4 bits, is %d\n", dd >> 4);
printf("value of ee right shift by 1 bits, is %d\n", ee >> 1);
printf("value of ee right shift by 2 bits, is %d\n", ee >> 2);
printf("value of ee right shift by 3 bits, is %d\n", ee >> 3);
return 0;
}
위의 C 예제 코드에서 #include <stdio.h>
를 라이브러리 헤더 파일로 사용하여 printf()
및 scanf()
우리 프로그램의 기능.
main
기능은 프로그램 실행의 시작점입니다. 운영 체제는 main
기능을 호출하여 프로그램 실행을 시작합니다.
다음 두 변수 dd
와 ee
는 서로 다른 두 부호 값인 양수와 음수로 초기화됩니다. 그런 다음 이동 프로세스는 printf()
함수에서 각각 1, 2 및 3 숫자로 발생하며 부호 값 ee
와 동일합니다.
음수에 대해 산술적 우측이동을 하면 위의 예와 같이 부호비트가 이동하면서 생성된 빈 슬롯에 복사된다. 두 값 모두 지정된 시간 동안 부호 있는 숫자와 부호 없는 숫자로 오른쪽으로 이동합니다.
부호 없는 숫자에서 이동은 논리적입니다. 값 15
를 포함하는 ee
변수에 표시되며 오른쪽으로 1비트, 2비트 및 3비트 이동됩니다.
값을 2로 나누면 숫자(비트)의 거듭제곱이 높아집니다. 예를 들어 1비트 이동하면 15/2^1이 되어 7이 됩니다.
부호 있는 값 이동 중에 첫 번째 비트 값은 이동을 위해 자신을 복사하고 이동하는 동안 빈 슬롯에 저장합니다.
출력:
부호 없는 값과 부호 있는 값에 대한 올바른 이동은 간단합니다. 빈 비트는 0으로 채워집니다. 음수 값의 경우 오른쪽 이동의 결과는 구현에 따라 정의됩니다.
아래 예에서 짝수를 사용하여 결과를 확인하고 짝수 및 홀수 부호에서 올바른 시프트 연산자의 작업을 이해합니다. 아래 주어진 코드를 보자.
#include <stdio.h>
int main(void) {
int dd = -16;
int ee = 16;
printf("value of dd right(sign bit) shift by 1 bits, is %d\n", dd >> 1);
printf("value of dd right shift(sign bit) by 2 bits, is %d\n", dd >> 2);
printf("value of dd right shift(sign bit) by 3 bits, is %d\n", dd >> 3);
printf("value of dd right shift by 4 bits, is %d\n", dd >> 4);
printf("value of ee right shift by 1 bits, is %d\n", ee >> 1);
printf("value of ee right shift by 2 bits, is %d\n", ee >> 2);
printf("value of ee right shift by 3 bits, is %d\n", ee >> 3);
return 0;
}
출력:
결론
논리 시프트(부호 비트)는 오른쪽 시프트에서 숫자 부호 변경 문제를 일으키고 이는 산술 오른쪽 시프트 연산자에서 제어할 수 있는 것으로 결론지었습니다. C 및 C++에는 산술 이동만 있으며 일부 영역은 정의되지 않고 구현에 따라 정의됩니다.