C의 시프트 연산자 유형

Luqman Khan 2024년2월15일
  1. C의 시프트 연산자
  2. C의 시프트 연산자 유형
  3. 결론
C의 시프트 연산자 유형

이 기사에서는 변수 값의 비트에서 수행되는 비트 연산자 유형인 시프트 연산자를 이해할 것입니다. 시프트 연산자에는 왼쪽 시프트 연산자와 오른쪽 시프트 연산자의 두 가지 유형이 있습니다.

이러한 연산자를 살펴보겠습니다.

C의 시프트 연산자

왼쪽 시프트 연산자는 << 기호로 표시되고 오른쪽 시프트 연산자는 >> 기호로 표시됩니다. 이러한 연산자는 이진 연산자이며 연산자 양쪽에 두 개의 피연산자가 필요하며 둘 다 정수여야 합니다.

오른쪽 시프트 산술 연산자의 구문은 다음과 같습니다.

n >> m ;

n의 값을 m 비트만큼 오른쪽으로 이동합니다. 여기서 nm은 정수입니다.

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 기능을 호출하여 프로그램 실행을 시작합니다.

다음 두 변수 ddee는 서로 다른 두 부호 값인 양수와 음수로 초기화됩니다. 그런 다음 이동 프로세스는 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;
}

출력:

오른쪽 시프트 - 출력 2

결론

논리 시프트(부호 비트)는 오른쪽 시프트에서 숫자 부호 변경 문제를 일으키고 이는 산술 오른쪽 시프트 연산자에서 제어할 수 있는 것으로 결론지었습니다. C 및 C++에는 산술 이동만 있으며 일부 영역은 정의되지 않고 구현에 따라 정의됩니다.

관련 문장 - C Operator