논리 시프트

Logical shift
다양한 프로그래밍 언어 및 프로세서의 논리 시프트 연산자
언어 또는 프로세서 왼쪽 맞다
아다[1] Shift_왼쪽 Shift_오른쪽
배치,[2] C, C++, Go, Swift(서명되지 않은 유형만 해당);
표준 ML, Verilog, PHP, [3]Python, Rust[4]
<< > >>
D, Java, JavaScript, Julia << > >>>
F#(서명되지 않은 유형만) <<<< > >>>
포트란 시프트 시프트
OCaml lsl lsr
오브젝트 파스칼, 델파이, x86 어셈블리, Kotlin, Powershell 할 수 있다 날카롭게 하다
VHSIC 하드웨어 기술 언어(VHDL), MIPS sll 할 수 없다
Power PC 슬루 srw

컴퓨터 과학에서 논리 이동은 피연산자의 모든 부분을 이동시키는 비트 단위 연산이다. 가지 기본 변형은 논리 왼쪽 시프트와 논리 오른쪽 시프트입니다.이는 주어진 값이 1만큼 왼쪽으로 이동하거나 n만큼 오른쪽으로 이동되는 등 비트 위치의 수에 따라 추가로 변조됩니다.산술적 시프트와 달리 논리 시프트는 숫자의 부호 비트를 유지하거나 숫자지수(mantissa)를 의미와 구별하지 않습니다. 오퍼랜드의 모든 비트는 주어진 수의 비트 위치로 이동되며 빈 비트 위치는 보통 0으로 채워지고 경우에 따라서는 1로 채워집니다(원형 시프트와의 대조).

논리 시프트는 피연산자가 숫자가 아닌 비트 시퀀스로 처리될 때 자주 사용됩니다.

논리적 이동은 부호 없는 정수를 2의 거듭제곱으로 곱하거나 나누는 효율적인 방법으로 유용할 수 있습니다.부호 있는 이진수 또는 부호 없는 이진수에서 n비트를 왼쪽으로 이동하면 2를n 곱하는 효과가 있습니다.부호 없는 이진수에서 n비트씩 오른쪽으로 이동하면 2로 나누는n 효과가 있습니다(0으로 반올림).

논리적 우측 변속은 산술적 우측 변속과 다릅니다.따라서 많은 언어에는 서로 다른 연산자가 있습니다.예를 들어 Java JavaScript에서는 논리적인 오른쪽 시프트 연산자는 >>이지만 산술적인 오른쪽 시프트 연산자는 >>입니다(Java에는 왼쪽 시프트 연산자(<)가1개밖에 없습니다.논리 및 산술에 의한 왼쪽 시프트 연산자는 동일하기 때문입니다).

, 프로그래밍 언어 C, C++Go에는 오른쪽 시프트 연산자가1개밖에 없습니다>대부분의 C 및 C++ 구현 및 Go는 이동할 정수 유형에 따라 수행할 오른쪽 이동을 선택합니다. 부호 있는 정수는 산술 시프트를 사용하여 이동되고 부호 없는 정수는 논리 시프트를 사용하여 이동됩니다.

현재 관련된 모든 C 표준(ISO/IEC 9899:1999 ~ 2011)은 결과가 정의되지 않은 방식으로 피연산자의 비트 수와 같거나 큰 경우에 대해 정의 갭을 남긴다.이를 통해 C 컴파일러는 동작이 다른 네이티브시프트 명령을 직접 사용할 수 있으므로 다양한 플랫폼에 대해 효율적인 코드를 내보낼 수 있습니다.예를 들어, Power의 shift-left-word.PC는 비트 폭 이상으로 이동하면 [5]0이 되는 보다 직관적인 동작을 선택하지만 x86의 SHL은 명령의 최대 실행 시간을 줄이기 위해 낮은 비트로 이동량을 마스킹하여 비트 폭만큼 이동해도 [6]값이 변경되지 않습니다.

일부 언어NET Framework LLVM도 비트 폭 이상의 시프트를 미지정(.NET)[7] 또는 정의되지 않음(LLVM).[8]다른 사용자는 x86 [9]동작을 지정하는 C# 등 가장 일반적인 타깃플랫폼의 동작을 지정합니다.

비트 시퀀스 0001 0111(10진수 23)이 논리적으로 1비트 위치만큼 이동하면 다음과 같이 됩니다.

시프트 좌측 수율: 0010 1110(10진수 46)
논리 좌회전 1비트
시프트 우회전 수율: 0000 1011 (10진수 11)
논리 우측 시프트 1비트

참고: MSB = 최상위 비트, LSB = 최하위 비트

레퍼런스

  1. ^ 주석이 달린 Ada 레퍼런스 매뉴얼
  2. ^ https://ss64.com/nt/set.html
  3. ^ "BitwiseOperators - Python Wiki". wiki.python.org. Retrieved 2018-01-24.
  4. ^ "Shl in std::ops - Rust". doc.rust-lang.org. Retrieved 2022-01-17.
  5. ^ "PowerPC Instruction Set: slw". pds.twi.tudelft.nl. Retrieved 9 April 2016.
  6. ^ "x86 Instruction Set Reference". x86.renejeschke.de. Retrieved 9 April 2016.
  7. ^ "Opcodes.Shl Field". msdn.microsoft.com. Microsoft. Retrieved 9 April 2016.
  8. ^ "LLVM Language Reference Manual - shl Instruction". llvm.org. LLVM Project. Retrieved 9 April 2016.
  9. ^ "<< Operator (C# Reference)". msdn.microsoft.com. Microsoft. Retrieved 9 April 2016.