C 언어에서 왼쪽 시프트 및 오른쪽 시프트 연산자를 이해하는 방법

清浅
풀어 주다: 2022-04-01 19:43:08
원래의
56434명이 탐색했습니다.

C 언어의 왼쪽 시프트는 왼쪽 시프트 연산자를 의미합니다. 이는 가장 높은 비트를 버리고 가장 낮은 비트를 0으로 채우는 것을 의미하며, C 언어의 오른쪽 시프트는 왼쪽 시프트와 반대되는 오른쪽 시프트 알고리즘입니다. 몇 곳을 옮겨보세요.

C 언어에서 왼쪽 시프트 및 오른쪽 시프트 연산자를 이해하는 방법

C 언어에서 왼쪽 시프트 및 오른쪽 시프트 연산자 사용: 왼쪽 시프트 연산자는 가장 높은 비트를 삭제한 다음 가장 낮은 비트에 0을 추가합니다. 오른쪽 시프트 알고리즘은 왼쪽 시프트와 반대이며 몇 비트를 이동합니다. to the right

C 언어의 왼쪽 시프트 연산자와 오른쪽 시프트 연산자는 C 언어의 연산자입니다. 다음 글에서는 이 두 연산자의 사용법을 자세히 소개하겠습니다. 이는 모두에게 도움이 되기를 바랍니다

【추천 과정: C 언어 튜토리얼

먼저 왼쪽 시프트에 대해 이야기해 보겠습니다. 왼쪽 시프트는 숫자의 모든 비트를 특정 자리만큼 왼쪽으로 이동하는 것을 의미합니다. << 예:

int i = 1;
i = i << 2;  //把i里的值左移2位
로그인 후 복사

즉, 1의 이진 시스템은 000...0001입니다(여기서 1 앞에 있는 0의 수는 int, 32비트 시스템의 자릿수와 관련이 있습니다. 31 0s in gcc), 왼쪽 시프트 2자리 이후에는 000...0100이 되며, 이는 10진수로 4이므로 1자리를 왼쪽으로 이동하는 것은 2를 곱한 것과 같습니다. 그런 다음 n자리를 왼쪽으로 이동하는 것은 2의 n제곱을 곱합니다(부호 있는 숫자는 완전히 적용 가능하지 않습니다. 왜냐하면 왼쪽 시프트로 인해 부호가 변경될 수 있기 때문입니다. 이유는 아래에 설명되어 있습니다.)
주의가 필요한 한 가지 문제는 m 끝의 부호 비트와 int 유형의 가장 왼쪽 버스에서는 시프트 아웃이 보고되지 않습니다. 우리는 int가 부호 정수를 가지며, 가장 왼쪽 1비트가 부호 비트, 즉 0은 양수이고 1은 음수라는 것을 알고 있습니다. 그러면 이동 시 오버플로가 발생합니다. 예:

int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
i = i << 1;
로그인 후 복사

그러면 i는 왼쪽으로 1비트 이동한 후 0x80000000이 됩니다. 즉, 이진수에서는 100000...0000이고 부호 비트는 1로 설정되고 나머지 비트는 모두 0이 됩니다. int 유형이 나타낼 수 있는 최소값은 -2147483648이며 이는 오버플로입니다. 만약 i가 1비트만큼 왼쪽으로 이동하면 어떻게 될까요? 1을 버리면 i의 값은 0이 됩니다.
왼쪽 시프트의 특별한 경우는 왼쪽으로 시프트된 자릿수가 숫자 유형의 최대 자릿수를 초과하는 경우 컴파일러는 왼쪽으로 시프트된 자릿수를 사용합니다. 유형의 최대 자릿수를 모듈로로 나눈 다음 나머지만큼 이동합니다. 예:

int i = 1, j = 0x80000000; //设int为32位
i = i << 33;   // 33 % 32 = 1 左移1位,i变成2
j = j << 33;   // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃
로그인 후 복사


gcc 사용 이 프로그램을 컴파일할 때 컴파일러는 왼쪽 이동 횟수 >= 유형 길이라는 경고를 표시합니다. .실제로 i와 j는 33%32 이후의 나머지 부분만큼 이동합니다.

gcc에서 다음은 이 규칙입니다.

간단히 말하면 왼쪽입니다. Shift의 의미: 최상위 비트를 버리고 최하위 비트를 0으로 채웁니다

오른쪽 Shift에 대해 이야기해 보겠습니다. 왼쪽 Shift의 원리를 이해하면 오른쪽 Shift가 더 이해하기 쉽습니다.

오른쪽 Shift의 개념은 반대입니다. 왼쪽 시프트, 즉 오른쪽으로 몇 비트 이동하는 것입니다. 연산자는 >>입니다.

오른쪽 시프트의 부호 비트는 왼쪽 시프트와 다릅니다. 부호 비트는 변경되지 않습니다. 예:

int i = 0x80000000;
i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000
로그인 후 복사

즉, 부호 비트가 오른쪽으로 이동한 후 양수에는 0이 추가되고 음수에는 1이 추가됩니다. 이는 어셈블리 언어의 산술 오른쪽 이동입니다. , 이동된 비트 수가 해당 유형의 길이를 초과하면 나머지가 취해진 다음 나머지가 이동됩니다.

负数10100110 >>5(假设字长为8位),则得到的是  11111101
로그인 후 복사

간단히 C에서 왼쪽 시프트는 논리/산술 왼쪽 시프트입니다(둘은 정확히 동일) 및 오른쪽 시프트 부호 비트를 변경하지 않고 유지하는 산술 오른쪽 시프트입니다. 실제 응용 프로그램에서는 왼쪽/오른쪽 시프트를 사용하여 상황에 따라 빠른 곱셈/나눗셈 연산을 수행할 수 있습니다.

반복보다 효율적입니다.

위 내용은 C 언어에서 왼쪽 시프트 및 오른쪽 시프트 연산자를 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿