비트 시프트 예제

Posted by | august 02, 2019 | Ikke-kategoriseret | No Comments

이러한 연산자는 모두 정수 값(int, long, short 및 바이트 또는 char)에 적용할 수 있습니다. 일부 언어에서는 int보다 작은 데이터 형식에 시프트 연산을 적용하면 자동으로 피연산자의 크기를 int로 조정합니다. 보시다시피 숫자는 한 위치로 왼쪽으로 이동하고 오른쪽의 마지막 숫자는 0으로 채워집니다. 또한 왼쪽을 이동하는 것은 2의 힘을 곱하는 것과 동일하다는 것을 확인할 수 있습니다. 따라서 6 << 1은 6 * 2에 해당하고 6 << 3은 6 * 8과 같습니다. 좋은 최적화 컴파일러는 가능하면 곱셈을 시프트로 바꿉습니다. 논리 및 연산자는 마스크가 1인 값만 유지되도록 합니다. 이제 해야 할 마지막 일은 모든 비트를 오른쪽으로 16개 배치(논리적 오른쪽 시프트)로 이동하여 올바른 정수 값을 얻는 것입니다. 또 다른 형태의 시프트는 원형 시프트, 비트 회전 또는 비트 회전입니다.

서명되지 않은 정수의 경우 숫자의 비트별 보완은 서명되지 않은 정수 범위의 중간 지점에서 숫자의 “미러 반사”입니다. 예를 들어, 8비트 서명되지 않은 정수의 경우 NOT x = 255 – x는 그래프에서 0에서 255까지의 증가 범위를 255에서 0으로 줄이는 범위를 효과적으로 “뒤집는” 하향 선으로 시각화할 수 있습니다. 간단하지만 예시적인 사용 예는 각 픽셀이 부호 없는 정수로 저장되는 그레이스케일 이미지를 반전시키는 것입니다. 이 속성으로 인해 가장 낮은 값 비트의 값을 확인 하 여 이진 번호의 패리티를 확인 하기 쉬워집니다. 위의 예제 사용: C및 C++는 올바른 시프트 연산자와 구별되지 않습니다. 그들은 단지 >> 연산자 제공 하 고 오른쪽 이동 동작은 서명 된 형식에 대 한 정의 된 구현. 나머지 답변은 C # / Java 연산을 사용합니다. 맨 맨 0은 바이트 에서 이동 하 고 새 0 바이트의 오른쪽 끝에 추가 되었습니다.

왼쪽 교대 연산자는 일반적으로 “<<"로 작성됩니다. 여기서 빈 공백은 비트가 오른쪽으로 이동될 때 왼쪽에 동시에 생성됩니다. 서명되지 않은 형식에서 수행되는 작업은 논리적 이동으로 공백이 0(0)으로 채워집니다. 서명된 형식에서 수행하면 결과가 기술적으로 정의되지 않고 컴파일러가 종속되지만[5] 대부분의 컴파일러는 산술 시프트를 수행하므로 공백이 왼쪽 방산의 기호 비트로 채워집니다. C-패밀리 언어에서 논리적 시프트 연산자는 왼쪽 교대조의 경우 "<“입니다. 이동할 장소 수는 연산자의 두 번째 인수로 지정됩니다. 예를 들어 <> 31비트 이상 이동하면 결과를 기대할 수 없습니다. 일반적으로 0이 아닌 원래 번호가 반환되며 정말 까다로운 버그가 될 수 있습니다. 서명되지 않은 8비트 값의 비트를 모든 비영점 비트가 오버플로될 때까지 반복적으로 왼쪽으로 이동합니다.

32 비트 또는 64 비트 모드에서는 두 버전 모두 훨씬 짧고 빠릅니다. 인텔 스카이레이크(http://agner.org/optimize/ 참조)와 같은 최신 의 외주문 실행 CPU는 매우 빠른 하드웨어 곱하기(낮은 대기 시간 및 높은 처리량)를 가지므로 이득이 훨씬 작습니다. AMD 불도저-가족은 조금 느린, 특히 64 비트 곱하기위한. 인텔 CPU와 AMD Ryzen에서 두 교대는 약간 낮은 대기 시간이지만 곱하기 보다 더 많은 명령 (이는 낮은 처리량으로 이어질 수 있음): Java 구현에서 이동하는 비트의 수는 소스의 크기에 따라 모드입니다.