C에서 비트 시프트 연산 사용

Jinku Hu 2023년10월12일
  1. <<연산자를 사용하여 C에서 숫자를 왼쪽으로 이동
  2. C에서 왼쪽 시프트를 2 씩 다중 정수로 사용
  3. 오른쪽 시프트-C의 산술 대 논리적 시프트 차이
C에서 비트 시프트 연산 사용

이 기사에서는 C에서 비트 시프트 연산을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

<<연산자를 사용하여 C에서 숫자를 왼쪽으로 이동

비트 시프트 연산은 모든 프로그래밍 언어의 일부이며 정수 피연산자의 각 비트를 지정된 자리 수만큼 재배치합니다. 이러한 연산의 효과를 더 잘 보여주기 위해 주어진 정수에 대한 이진 표현을 인쇄하는 다음 예제에binary라는 함수를 포함했습니다. 이 함수는 32 비트 정수 값으로 만 작동하도록 구현됩니다. 다음 예제 코드는 두 위치만큼 왼쪽 이동을 보여주고 그에 따라 숫자 표현을 표시합니다.

#include <stdio.h>
#include <stdlib.h>

void binary(unsigned n) {
  unsigned i;
  for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}

int main(int argc, char *argv[]) {
  int n1 = 123;

  binary(n1);
  printf(" : %d\n", n1);
  n1 <<= 2;
  binary(n1);
  printf(" : %d\n", n1);

  exit(EXIT_SUCCESS);
}

출력:

00000000000000000000000001111011 : 123
00000000000000000000000111101100 : 492

C에서 왼쪽 시프트를 2 씩 다중 정수로 사용

왼쪽 시프트 연산을 사용하여 2 배의 곱셈을 구현할 수 있으며, 이는 하드웨어에서 더 효율적일 수 있습니다. 왼쪽으로 이동할 때 산술 및 논리적 이동간에 차이가 없습니다. 주어진 정수에 대한 단일 위치 이동은 곱셈이됩니다. 따라서 우리는 그에 따라 곱셈을 얻기 위해 더 멀리 이동할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>

void binary(unsigned n) {
  unsigned i;
  for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}

int main(int argc, char *argv[]) {
  int n1 = 123;

  printf("%d\n", n1);
  n1 <<= 1;
  printf("%d x2\n", n1);

  exit(EXIT_SUCCESS);
}

출력:

492
984 x2

오른쪽 시프트-C의 산술 대 논리적 시프트 차이

부호있는및 부호없는정수는 후드 아래에서 다르게 표현된다는 점을 언급해야합니다. 즉,signed는 2의 보수 값으로 구현됩니다. 결과적으로 음수의 최상위 비트는 부호 비트라고하는1이고 양의 정수는 평소와 같이0으로 시작합니다. 따라서 음수를 논리적으로 오른쪽으로 이동하면 부호를 잃고 양의 정수를 얻습니다. 따라서 우리는 논리 및 산술 시프트를 구별해야하며 후자는 가장 중요한 비트를 보존합니다. 개념에 차이가 있지만 C는 별도의 연산자를 제공하지 않습니다. 또한 C 표준은 하드웨어 구현에 의해 정의 된 동작을 지정하지 않습니다. 다음 예제 출력에서 ​​볼 수 있듯이 기본 시스템은 산술 시프트를 수행하고 정수의 음수 값을 유지했습니다.

#include <stdio.h>
#include <stdlib.h>

void binary(unsigned n) {
  unsigned i;
  for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}

int main(int argc, char *argv[]) {
  int n2 = -24;

  binary(n2);
  printf(" : %d\n", n2);
  n2 >>= 3;
  binary(n2);
  printf(" : %d\n", n2);

  exit(EXIT_SUCCESS);
}

출력:

11111111111111111111111111101000 : -24
11111111111111111111111111111101 : -3
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook