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
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